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

public class exampleExecute extends ExampleVisitor<String>{
    
    public HashMap<String, String> map = new HashMap<>();
     private Scanner scanner = new Scanner(System.in);
    

//functions (visitSomethingStat)

    //ID ':' expr      #defineStat
    @Override
    public String visitDefineStat(ExampleParser.DefineStatContext ctx){
        String id = ctx.ID().getText();     //get id val
        String val = visit(ctx.expr());     // get var do expr
        map.put(id, val);                   //assign
        return null;
    }


    //expr '+' expr     #concatStat
    @Override
    public String visitConcatStat(ExampleParser.ConcatStatContext ctx) {
        String left = visit(ctx.expr(0));       //1st expr
        String right = visit(ctx.expr(1));      //2nd expr
        String result = left + right;           //concat
        return result;
    }


//exprs


    //idExpr: procura no mapa, erro se não existir
    @Override
    public String visitIdExpr(ExampleParser.IdExprContext ctx) {
        String id = ctx.ID().getText();
        if (!map.containsKey(id))
            throw new RuntimeException("Erro semântico: variável '" + id + "' não definida!"); 
        return map.get(id);
    }

    //'input' '(' STRING ')'    #inputExpr
    @Override
    public String visitInputExpr(ExampleParser.InputExprContext ctx) {
        String prompt = ctx.STRING().getText().replaceAll("^\"|\"$", "");
        System.out.print(prompt);
        return scanner.nextLine();
    }

    //stringLiteral: STRING
    @Override
    public String visitStringLiteral(ExampleParser.StringLiteralContext ctx) {
        return ctx.STRING().getText().replaceAll("^\"|\"$", "");    // remove aspas
    }

    //Parentises
    @Override
    public String visitParenExpr(ExampleParser.ParenExprContext ctx) {
        return visit(ctx.expr());
    }

    //subUnary ( - expr )
    @Override
    public String visitSubUnaryExpr(ExampleParser.SubUnaryExprContext ctx) {
        String inner = visit(ctx.expr());
        return "-" + inner;
    }
}
