import java.util.HashMap;
import java.util.Map;
import java.util.Scanner;

@SuppressWarnings("CheckReturnValue")
public class Execute extends StrLangBaseVisitor<String> {

   private Map<String,String> variables = new HashMap<String,String>();
   Scanner sc = new Scanner(System.in);

   @Override public String visitProgram(StrLangParser.ProgramContext ctx) {
      String res = null;
      
      return visitChildren(ctx);
      //return res;
   }

   @Override public String visitStatement(StrLangParser.StatementContext ctx) {
      String res = null;

      return visitChildren(ctx);
      //return res;
   }

   @Override public String visitPrint(StrLangParser.PrintContext ctx) {
      String value = "";

      if (ctx.expression()!=null){
         String content = visit(ctx.expression());
         content = content.replace("\"","");

         for (String key : variables.keySet()){
            if (content.equals(key)){
               content = getVariable(key).replace("\"","");
            }
         }
         System.out.println(content);
      }

      return visitChildren(ctx);
      //return res;
   }

   @Override public String visitDefinevariable(StrLangParser.DefinevariableContext ctx) {
      String key = ctx.ID().getText();
      String value = "";

      if(ctx.expression()!=null){
         value = visit(ctx.expression());
      }
      if (ctx.input()!=null){
         String input = ctx.input().CONTENT().getText().replace("\"","");
         System.out.print(input);
         String content = sc.nextLine();
         value= content.replace("\"","");
      }

      addVariable(key, value);
      
      return visitChildren(ctx);
      //return res;
   }

   public void addVariable(String key, String value){
      variables.put(key, value);
   }

   public String getVariable(String key){
      return variables.get(key);
   }

   @Override
   public String visitConcatExpression(StrLangParser.ConcatExpressionContext ctx) {
      String string1 = visit(ctx.expression(0));
      String string2 = visit(ctx.expression(1));
      String concat = string1 + string2;
      //System.out.println(concat);
      return concat;
   }

   @Override
   public String visitRemoveExpression(StrLangParser.RemoveExpressionContext ctx) {
      String string1 = visit(ctx.expression(0));
      String string2 = visit(ctx.expression(1));
      String remove = string1.replace(string2, "");
      //System.out.println(remove);
      return remove;
   }

   @Override
   public String visitTrimExpression(StrLangParser.TrimExpressionContext ctx) {
      String string = visit(ctx.expression());
      String trimmed = string.trim();
      //System.out.println(trimmed);
      return trimmed;
   }

   @Override
   public String visitParenthesisExpression(StrLangParser.ParenthesisExpressionContext ctx) {
      return visit(ctx.expression());
   }

   @Override
   public String visitReplaceExpression(StrLangParser.ReplaceExpressionContext ctx) {
      String string1 = visit(ctx.expression(0));
      String string2 = visit(ctx.expression(1));
      String string3 = visit(ctx.expression(2));
      String replace = string1.replace(string2, string3);
      //System.out.println(replace);
      return replace;
   }

   @Override
   public String visitContentExpression(StrLangParser.ContentExpressionContext ctx) {
      return ctx.CONTENT().getText().replace("\"", "");
   }

   @Override
   public String visitIdExpression(StrLangParser.IdExpressionContext ctx) {
      String key = ctx.ID().getText();
      return getVariable(key);
   }
}
