package edu.uci.ics.asterix.aql.expression.visitor;

import java.io.PrintWriter;
import java.util.Iterator;
import java.util.List;

import edu.uci.ics.asterix.aql.base.Clause;
import edu.uci.ics.asterix.aql.base.Expression;
import edu.uci.ics.asterix.aql.base.ILiteral;
import edu.uci.ics.asterix.aql.base.Statement;
import edu.uci.ics.asterix.aql.expression.BeginFeedStatement;
import edu.uci.ics.asterix.aql.expression.CallExpr;
import edu.uci.ics.asterix.aql.expression.ControlFeedStatement;
import edu.uci.ics.asterix.aql.expression.CreateDataverseStatement;
import edu.uci.ics.asterix.aql.expression.CreateFunctionStatement;
import edu.uci.ics.asterix.aql.expression.CreateIndexStatement;
import edu.uci.ics.asterix.aql.expression.DatasetDecl;
import edu.uci.ics.asterix.aql.expression.DataverseDecl;
import edu.uci.ics.asterix.aql.expression.DataverseDropStatement;
import edu.uci.ics.asterix.aql.expression.DeleteStatement;
import edu.uci.ics.asterix.aql.expression.DieClause;
import edu.uci.ics.asterix.aql.expression.DistinctClause;
import edu.uci.ics.asterix.aql.expression.DropStatement;
import edu.uci.ics.asterix.aql.expression.FLWOGRExpression;
import edu.uci.ics.asterix.aql.expression.FieldAccessor;
import edu.uci.ics.asterix.aql.expression.FieldBinding;
import edu.uci.ics.asterix.aql.expression.ForClause;
import edu.uci.ics.asterix.aql.expression.FunctionDecl;
import edu.uci.ics.asterix.aql.expression.FunctionDropStatement;
import edu.uci.ics.asterix.aql.expression.GbyVariableExpressionPair;
import edu.uci.ics.asterix.aql.expression.GroupbyClause;
import edu.uci.ics.asterix.aql.expression.IfExpr;
import edu.uci.ics.asterix.aql.expression.IndexAccessor;
import edu.uci.ics.asterix.aql.expression.IndexDropStatement;
import edu.uci.ics.asterix.aql.expression.InsertStatement;
import edu.uci.ics.asterix.aql.expression.LetClause;
import edu.uci.ics.asterix.aql.expression.LimitClause;
import edu.uci.ics.asterix.aql.expression.ListConstructor;
import edu.uci.ics.asterix.aql.expression.LiteralExpr;
import edu.uci.ics.asterix.aql.expression.LoadFromFileStatement;
import edu.uci.ics.asterix.aql.expression.NodeGroupDropStatement;
import edu.uci.ics.asterix.aql.expression.NodegroupDecl;
import edu.uci.ics.asterix.aql.expression.OperatorExpr;
import edu.uci.ics.asterix.aql.expression.OperatorType;
import edu.uci.ics.asterix.aql.expression.OrderbyClause;
import edu.uci.ics.asterix.aql.expression.OrderbyClause.OrderModifier;
import edu.uci.ics.asterix.aql.expression.OrderedListTypeDefinition;
import edu.uci.ics.asterix.aql.expression.QuantifiedExpression;
import edu.uci.ics.asterix.aql.expression.QuantifiedPair;
import edu.uci.ics.asterix.aql.expression.Query;
import edu.uci.ics.asterix.aql.expression.RecordConstructor;
import edu.uci.ics.asterix.aql.expression.RecordTypeDefinition;
import edu.uci.ics.asterix.aql.expression.RecordTypeDefinition.RecordKind;
import edu.uci.ics.asterix.aql.expression.SetStatement;
import edu.uci.ics.asterix.aql.expression.TypeDecl;
import edu.uci.ics.asterix.aql.expression.TypeDropStatement;
import edu.uci.ics.asterix.aql.expression.TypeExpression;
import edu.uci.ics.asterix.aql.expression.TypeReferenceExpression;
import edu.uci.ics.asterix.aql.expression.UnaryExpr;
import edu.uci.ics.asterix.aql.expression.UnionExpr;
import edu.uci.ics.asterix.aql.expression.UnorderedListTypeDefinition;
import edu.uci.ics.asterix.aql.expression.UpdateClause;
import edu.uci.ics.asterix.aql.expression.UpdateStatement;
import edu.uci.ics.asterix.aql.expression.VariableExpr;
import edu.uci.ics.asterix.aql.expression.WhereClause;
import edu.uci.ics.asterix.aql.expression.WriteFromQueryResultStatement;
import edu.uci.ics.asterix.aql.expression.WriteStatement;
import edu.uci.ics.asterix.common.config.DatasetConfig.DatasetType;
import edu.uci.ics.asterix.common.exceptions.AsterixException;
import edu.uci.ics.asterix.aql.expression.InternalDetailsDecl;

public class AQLPrintVisitor implements IAqlVisitorWithVoidReturn<Integer> {
    // private int level =0;
    private final PrintWriter out;

    public AQLPrintVisitor() {
        out = new PrintWriter(System.out);
    }

    public AQLPrintVisitor(PrintWriter out) {
        this.out = out;
    }

    private String skip(int step) {
        StringBuffer sb = new StringBuffer();
        for (int i = 0; i < step; i++)
            sb.append("  ");
        return sb.toString();
    }

    @Override
    public void visit(Query q, Integer step) throws AsterixException {
        for (Statement d : q.getPrologDeclList()) {
            d.accept(this, step);
        }
        if (q.getBody() != null) {
            out.println("Query:");
            q.getBody().accept(this, step);
        } else {
            out.println("No query.");
        }
    }

    @Override
    public void visit(LiteralExpr l, Integer step) {
        ILiteral lc = l.getValue();
        if (lc.getLiteralType().equals(ILiteral.Type.TRUE) || lc.getLiteralType().equals(ILiteral.Type.FALSE)
                || lc.getLiteralType().equals(ILiteral.Type.NULL)) {
            out.println(skip(step) + "LiteralExpr [" + l.getValue().getLiteralType() + "]");
        } else {
            out.println(skip(step) + "LiteralExpr [" + l.getValue().getLiteralType() + "] ["
                    + l.getValue().getStringValue() + "] ");
        }
    }

    @Override
    public void visit(VariableExpr v, Integer step) {
        out.println(skip(step) + "Variable [ Name=" + v.getVar().getValue() + " Id=" + v.getVar().getId() + " ]");
    }

    @Override
    public void visit(ListConstructor lc, Integer step) throws AsterixException {
        boolean ordered = false;
        if (lc.getType().equals(ListConstructor.Type.ORDERED_LIST_CONSTRUCTOR)) {
            ordered = true;
        }

        out.println(skip(step) + (ordered == true ? "OrderedListConstructor " : "UnorderedListConstructor ") + "[");
        for (Expression e : lc.getExprList()) {
            e.accept(this, step + 1);
        }
        out.println(skip(step) + "]");
    }

    @Override
    public void visit(RecordConstructor rc, Integer step) throws AsterixException {
        out.println(skip(step) + "RecordConstructor [");
        // fbList accept visitor
        for (FieldBinding fb : rc.getFbList()) {
            out.println(skip(step + 1) + "(");
            fb.getLeftExpr().accept(this, step + 2);
            out.println(skip(step + 2) + ":");
            fb.getRightExpr().accept(this, step + 2);
            out.println(skip(step + 1) + ")");
        }
        out.println(skip(step) + "]");
    }

    @Override
    public void visit(CallExpr pf, Integer step) throws AsterixException {
        out.println(skip(step) + "FunctionCall " + pf.getIdent().toString() + "[");
        for (Expression expr : pf.getExprList()) {
            expr.accept(this, step + 1);
        }
        out.println(skip(step) + "]");
    }

    @Override
    public void visit(OperatorExpr ifbo, Integer step) throws AsterixException {
        List<Expression> exprList = ifbo.getExprList();
        List<OperatorType> opList = ifbo.getOpList();
        if (ifbo.isCurrentop()) {
            out.println(skip(step) + "OperatorExpr [");
            exprList.get(0).accept(this, step + 1);
            for (int i = 1; i < exprList.size(); i++) {
                out.println(skip(step + 1) + opList.get(i - 1));
                exprList.get(i).accept(this, step + 1);
            }
            out.println(skip(step) + "]");
        } else {
            exprList.get(0).accept(this, step);
        }

    }

    @Override
    public void visit(IfExpr ifexpr, Integer step) throws AsterixException {
        out.println(skip(step) + "IfExpr [");
        out.println(skip(step + 1) + "Condition:");
        ifexpr.getCondExpr().accept(this, step + 2);
        out.println(skip(step + 1) + "Then:");
        ifexpr.getThenExpr().accept(this, step + 2);
        out.println(skip(step + 1) + "Else:");
        ifexpr.getElseExpr().accept(this, step + 2);
        out.println(skip(step) + "]");
    }

    @Override
    public void visit(FLWOGRExpression flwor, Integer step) throws AsterixException {
        out.println(skip(step) + "FLWOGR [");
        for (Clause cl : flwor.getClauseList()) {
            cl.accept(this, step + 1);
        }
        out.println(skip(step + 1) + "Return");
        flwor.getReturnExpr().accept(this, step + 2);
        out.println(skip(step) + "]");
    }

    @Override
    public void visit(QuantifiedExpression qe, Integer step) throws AsterixException {
        out.println(skip(step) + "QuantifiedExpression " + qe.getQuantifier() + " [");
        // quantifiedList accept visitor
        for (QuantifiedPair pair : qe.getQuantifiedList()) {
            out.print(skip(step + 1) + "[");
            pair.getVarExpr().accept(this, 0);
            out.println(skip(step + 1) + "In");
            pair.getExpr().accept(this, step + 2);
            out.println(skip(step + 1) + "]");
        }
        out.println(skip(step + 1) + "Satifies [");
        qe.getSatisfiesExpr().accept(this, step + 2);
        out.println(skip(step + 1) + "]");// for satifies
        out.println(skip(step) + "]");// for quantifiedExpr
    }

    @Override
    public void visit(ForClause fc, Integer step) throws AsterixException {
        out.print(skip(step) + "For ");
        fc.getVarExpr().accept(this, 0);
        out.println(skip(step + 1) + "In ");
        fc.getInExpr().accept(this, step + 1);
    }

    @Override
    public void visit(LetClause lc, Integer step) throws AsterixException {
        out.print(skip(step) + "Let ");
        lc.getVarExpr().accept(this, 0);
        out.println(skip(step + 1) + ":= ");
        lc.getBindingExpr().accept(this, step + 1);
    }

    @Override
    public void visit(WhereClause wc, Integer step) throws AsterixException {
        out.println(skip(step) + "Where ");
        wc.getWhereExpr().accept(this, step + 1);
    }

    @Override
    public void visit(OrderbyClause oc, Integer step) throws AsterixException {
        out.println(skip(step) + "Orderby");
        List<OrderModifier> mlist = oc.getModifierList();
        List<Expression> list = oc.getOrderbyList();
        for (int i = 0; i < list.size(); i++) {
            list.get(i).accept(this, step + 1);
            out.println(skip(step + 1) + mlist.get(i).toString());
        }
        out.println(skip(step));
    }

    @Override
    public void visit(GroupbyClause gc, Integer step) throws AsterixException {
        out.println(skip(step) + "Groupby");
        for (GbyVariableExpressionPair pair : gc.getGbyPairList()) {

            if (pair.getVar() != null) {
                pair.getVar().accept(this, step + 1);
                out.println(skip(step + 1) + ":=");
            }

            pair.getExpr().accept(this, step + 1);
        }
        if (!gc.getDecorPairList().isEmpty()) {
            out.println(skip(step + 1) + "Decor");
            for (GbyVariableExpressionPair pair : gc.getDecorPairList()) {
                if (pair.getVar() != null) {
                    pair.getVar().accept(this, step + 1);
                    out.println(skip(step + 1) + ":=");
                }
                pair.getExpr().accept(this, step + 1);
            }
        }
        out.println(skip(step + 1) + "With");
        for (VariableExpr exp : gc.getWithVarList()) {
            exp.accept(this, step + 1);
        }
        out.println(skip(step));
    }

    @Override
    public void visit(LimitClause lc, Integer step) throws AsterixException {
        out.println(skip(step) + "Limit");
        lc.getLimitExpr().accept(this, step + 1);
        if (lc.getOffset() != null) {
            out.println(skip(step + 1) + "Offset");
            lc.getOffset().accept(this, step + 2);
        }
    }

    @Override
    public void visit(DieClause lc, Integer step) throws AsterixException {
        out.println(skip(step) + "Limit");
        lc.getDieExpr().accept(this, step + 1);
    }

    @Override
    public void visit(FunctionDecl fd, Integer step) throws AsterixException {
        out.println(skip(step) + "FunctionDecl " + fd.getIdent().getValue() + "(" + fd.getParamList().toString()
                + ") {");
        fd.getFuncBody().accept(this, step + 1);
        out.println(skip(step) + "}");
        out.println();
    }

    @Override
    public void visit(UnaryExpr u, Integer step) throws AsterixException {
        if (u.getSign() != null) {
            out.print(skip(step) + u.getSign() + " ");
            u.getExpr().accept(this, 0);
        } else
            u.getExpr().accept(this, step);
    }

    @Override
    public void visit(FieldAccessor fa, Integer step) throws AsterixException {
        out.println(skip(step) + "FieldAccessor [");
        fa.getExpr().accept(this, step + 1);
        out.println(skip(step + 1) + "Field=" + ((FieldAccessor) fa).getIdent().getValue());
        out.println(skip(step) + "]");

    }

    @Override
    public void visit(IndexAccessor fa, Integer step) throws AsterixException {
        out.println(skip(step) + "IndexAccessor [");
        fa.getExpr().accept(this, step + 1);
        out.print(skip(step + 1) + "Index: ");
        out.println((((IndexAccessor) fa).isAny() ? "ANY" : ((IndexAccessor) fa).getIndex()));

        out.println(skip(step) + "]");

    }

    @Override
    public void visit(TypeDecl t, Integer step) throws AsterixException {
        out.println(skip(step) + "TypeDecl " + t.getIdent() + " [");
        t.getTypeDef().accept(this, step + 1);
        out.println(skip(step) + "]");
    }

    @Override
    public void visit(TypeReferenceExpression t, Integer arg) throws AsterixException {
        out.print(t.getIdent());
    }

    @Override
    public void visit(RecordTypeDefinition r, Integer step) throws AsterixException {
        if (r.getRecordKind() == RecordKind.CLOSED) {
            out.print(skip(step) + "closed ");
        } else {
            out.print(skip(step) + "open ");
        }
        out.println("RecordType {");
        Iterator<String> nameIter = r.getFieldNames().iterator();
        Iterator<TypeExpression> typeIter = r.getFieldTypes().iterator();
        Iterator<Boolean> isnullableIter = r.getNullableFields().iterator();
        boolean first = true;
        while (nameIter.hasNext()) {
            if (first) {
                first = false;
            } else {
                out.println(",");
            }
            String name = nameIter.next();
            TypeExpression texp = typeIter.next();
            Boolean isNullable = isnullableIter.next();
            out.print(skip(step + 1) + name + " : ");
            texp.accept(this, step + 2);
            if (isNullable) {
                out.print("?");
            }
        }
        out.println();
        out.println(skip(step) + "}");
    }

    @Override
    public void visit(OrderedListTypeDefinition x, Integer step) throws AsterixException {
        out.print("OrderedList [");
        x.getItemTypeExpression().accept(this, step + 2);
        out.println("]");
    }

    @Override
    public void visit(UnorderedListTypeDefinition x, Integer step) throws AsterixException {
        out.print("UnorderedList <");
        x.getItemTypeExpression().accept(this, step + 2);
        out.println(">");
    }

    @Override
    public void visit(DatasetDecl dd, Integer step) throws AsterixException {
        if (dd.getDatasetType() == DatasetType.INTERNAL) {
            out.println(skip(step) + "DatasetDecl" + dd.getName() + "(" + dd.getItemTypeName() + ")"
                    + " partitioned by " + ((InternalDetailsDecl) dd.getDatasetDetailsDecl()).getPartitioningExprs());
        } else if (dd.getDatasetType() == DatasetType.EXTERNAL) {
            out.println(skip(step) + "DatasetDecl" + dd.getName() + "(" + dd.getItemTypeName() + ")"
                    + "is an external dataset");
        } else if (dd.getDatasetType() == DatasetType.FEED) {
            out.println(skip(step) + "DatasetDecl" + dd.getName() + "(" + dd.getItemTypeName() + ")"
                    + "is an feed dataset");
        }
    }

    @Override
    public void visit(DataverseDecl dv, Integer step) throws AsterixException {
        out.println(skip(step) + "DataverseUse " + dv.getDataverseName());
    }

    @Override
    public void visit(NodegroupDecl ngd, Integer step) throws AsterixException {
        out.println(skip(step) + "Nodegroup " + ngd.getNodeControllerNames());
    }

    @Override
    public void visit(LoadFromFileStatement stmtLoad, Integer arg) throws AsterixException {
        // TODO Auto-generated method stub

    }

    @Override
    public void visit(WriteFromQueryResultStatement stmtLoad, Integer arg) throws AsterixException {
        // TODO Auto-generated method stub

    }

    @Override
    public void visit(DropStatement stmtDel, Integer arg) throws AsterixException {
        // TODO Auto-generated method stub

    }

    @Override
    public void visit(WriteStatement ws, Integer step) throws AsterixException {
        out.print(skip(step) + "WriteOutputTo " + ws.getNcName() + ":" + ws.getFileName());
        if (ws.getWriterClassName() != null) {
            out.print(" using " + ws.getWriterClassName());
        }
        out.println();
    }

    @Override
    public void visit(SetStatement ss, Integer step) throws AsterixException {
        out.println(skip(step) + "Set " + ss.getPropName() + "=" + ss.getPropValue());
    }

    @Override
    public void visit(CreateIndexStatement cis, Integer arg) throws AsterixException {
        // TODO Auto-generated method stub

    }

    @Override
    public void visit(ControlFeedStatement ss, Integer step) throws AsterixException {
        out.println(skip(step) + ss.getOperationType() + skip(step) + ss.getDatasetName());
    }

    @Override
    public void visit(UnionExpr u, Integer step) throws AsterixException {
        out.println(skip(step) + "Union [");
        for (Expression expr : u.getExprs()) {
            expr.accept(this, step + 1);
        }
        out.println(skip(step) + "]");
    }

    @Override
    public void visit(DistinctClause dc, Integer step) throws AsterixException {
        out.print(skip(step) + "Distinct ");
        for (Expression expr : dc.getDistinctByExpr())
            expr.accept(this, step + 1);
    }

    @Override
    public void visit(InsertStatement stmtDel, Integer arg) throws AsterixException {
        // TODO Auto-generated method stub

    }

    @Override
    public void visit(DeleteStatement stmtDel, Integer arg) throws AsterixException {
        // TODO Auto-generated method stub

    }

    @Override
    public void visit(UpdateStatement stmtDel, Integer arg) throws AsterixException {
        // TODO Auto-generated method stub

    }

    @Override
    public void visit(UpdateClause updateClause, Integer arg) throws AsterixException {
        // TODO Auto-generated method stub

    }

    @Override
    public void visit(CreateDataverseStatement stmtDel, Integer arg) throws AsterixException {
        // TODO Auto-generated method stub
    }

    @Override
    public void visit(IndexDropStatement stmtDel, Integer arg) throws AsterixException {
        // TODO Auto-generated method stub
    }

    @Override
    public void visit(NodeGroupDropStatement deleteStatement, Integer arg) throws AsterixException {
        // TODO Auto-generated method stub
    }

    @Override
    public void visit(DataverseDropStatement deleteStatement, Integer arg) throws AsterixException {
        // TODO Auto-generated method stub
    }

    @Override
    public void visit(TypeDropStatement deleteStatement, Integer arg) throws AsterixException {
        // TODO Auto-generated method stub
    }

    @Override
    public void visit(CreateFunctionStatement cfs, Integer arg) throws AsterixException {
        // TODO Auto-generated method stub
        
    }

    @Override
    public void visit(FunctionDropStatement fds, Integer arg) throws AsterixException {
        // TODO Auto-generated method stub
        
    }

    @Override
    public void visit(BeginFeedStatement stmtDel, Integer arg) throws AsterixException {
        // TODO Auto-generated method stub
        
    }

}
