package demos.getcrud;

import gudusoft.gsqlparser.nodes.TObjectName;
import gudusoft.gsqlparser.EDbVendor;
import gudusoft.gsqlparser.TGSqlParser;
import gudusoft.gsqlparser.TCustomSqlStatement;

import java.io.File;


class tableEffected{
    public final static int select = 0;
    public final static int createtable = 1;
    public final static int delete = 2;
    public final static int insert = 3;
    public final static int update = 4;
    public final static String[] stmtstr = {"s","c","d","i","u"};

    TObjectName tablename;
    int[] statetments;
    public tableEffected(){
        statetments = new int[5];
    }
}

class crud{
   public final static int 	max_tables = 100;
   tableEffected[] tables ;
   int total_tables;
   EDbVendor dbvendor;
   String sqlfile;


    public crud(EDbVendor db, String sqlfile){
        this.dbvendor = db;
        this.sqlfile = sqlfile;
        tables = new tableEffected[max_tables];
        total_tables = 0;
    }

    public int run(){
        TGSqlParser sqlparser = new TGSqlParser(this.dbvendor);
        sqlparser.sqlfilename = sqlfile;
        int ret = sqlparser.parse();
        if (ret != 0){
            System.out.println(sqlparser.getErrormessage());
            return ret;
        }

        for (int i=0;i<sqlparser.sqlstatements.size();i++){
            analyzeStmt(sqlparser.sqlstatements.get(i));
        }

        showResult();
        return ret;
    }

    void showResult(){
        String str="";

        for(int i=0;i<total_tables;i++){
            for(int j=0;j<5;j++){
              str = str+"\t\t\t\t"+tables[i].statetments[j]+"("+tableEffected.stmtstr[j]+")";
            }
            System.out.println(tables[i].tablename.toString()+str);
            str = "";
        }

    }

    protected void analyzeStmt(TCustomSqlStatement stmt){
        for(int i=0;i<stmt.tables.size();i++){
            if  (stmt.tables.getTable(i).isBaseTable())
            {
                if ( (stmt.dbvendor == EDbVendor.dbvmssql)
                        &&( (stmt.tables.getTable(i).getFullName().equalsIgnoreCase("deleted"))
                            ||(stmt.tables.getTable(i).getFullName().equalsIgnoreCase("inserted"))
                           )
                  ){
                    continue;
                }

              switch(stmt.sqlstatementtype){
                  case sstselect:
                      addTable(stmt.tables.getTable(i).getTableName(),tableEffected.select);
                      break;
                  case sstcreatetable:
                      addTable(stmt.tables.getTable(i).getTableName(),tableEffected.createtable);
                      break;
                  case sstdelete:
                      if (i == 0){
                        addTable(stmt.tables.getTable(i).getTableName(),tableEffected.delete);
                      }else{
                          addTable(stmt.tables.getTable(i).getTableName(),tableEffected.select);
                      }
                      break;
                  case sstinsert:
                      addTable(stmt.tables.getTable(i).getTableName(),tableEffected.insert);
                      break;
                  case sstupdate:
                      if (i == 0){
                        addTable(stmt.tables.getTable(i).getTableName(),tableEffected.update);
                      }else{
                        addTable(stmt.tables.getTable(i).getTableName(),tableEffected.select);
                      }
                      break;
                  default:
                      System.out.println(stmt.sqlstatementtype.toString()+" was not supported, you can extend this demo to support this kind SQL statement.");
                      break;
              }

            }
            //System.out.println(stmt.tables.getTable(i).getFullName());
        }

        for (int i=0;i<stmt.getStatements().size();i++){
           analyzeStmt(stmt.getStatements().get(i));
        }
    }


    void addTable(TObjectName tablename,int kind){
       //check is this table already in tables
        boolean isFound = false;

        for(int i=0;i<total_tables;i++){
            if (tables[i].tablename.toString().compareToIgnoreCase(tablename.toString()) == 0){
               tables[i].statetments[kind]++;
                isFound = true;
                break;
            }
        }

         if (!isFound){
          tables[total_tables] = new  tableEffected();
          tables[total_tables].tablename = tablename;
          tables[total_tables].statetments[kind]++;
          total_tables++;
         }

    }
}

public class getcrud {

    public static void main(String args[])
     {
       long t = System.currentTimeMillis();

       if (args.length != 1){
           System.out.println("Usage: java getcrud sqlfile.sql");
           return;
       }
       File file=new File(args[0]);
       if (!file.exists()){
           System.out.println("File not exists:"+args[0]);
           return;
       }


     crud go = new crud(EDbVendor.dbvoracle,file.getPath());
     go.run();

     System.out.println("Time Escaped: "+ (System.currentTimeMillis() - t) );
     }

}
