import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.nio.ByteBuffer;
import java.nio.charset.StandardCharsets;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.sql.*;
import java.util.HashMap;
import java.util.Map;
import java.util.Properties;

import org.apache.commons.cli.CommandLine;
import org.apache.commons.cli.CommandLineParser;
import org.apache.commons.cli.GnuParser;
import org.apache.commons.cli.HelpFormatter;
import org.apache.commons.cli.Options;
import org.ho.yaml.Yaml;

import com.amazonaws.auth.BasicAWSCredentials;
import com.amazonaws.services.s3.transfer.Download;
import com.amazonaws.services.s3.transfer.TransferManager;



public class ExecuteDMLSQL {

	public static String sqlUri     = "";
	public static String configFilePath = "/mnt/data/ETL/java/accounting/config/config.yml";
	
	public static void main(String[] args) throws Exception{
		Map<String,Object> conf = new HashMap<String,Object>();
		
		Options options = new Options();
		//Optional Params
		options.addOption("configFilePath",true,"(Optional) Config.yml file for this cli tool (Default: /mnt/data/ETL/java/accounting/config/config.yml)");
		
		//Required Params
		options.addOption("sqlUri",true,"Path to the sql file on S3");
		options.addOption("bucket",true,"Bucket at which SQL files are stored");
		
		if(args==null || args.length==0){
			HelpFormatter formatter = new HelpFormatter();
			formatter.printHelp("ant run -Dargs='paramA=xxx paramB=yyy .....'", options);
			System.exit(1);
		}
		//Parsing arguments
		CommandLineParser parser = new GnuParser();
		CommandLine cmd = parser.parse( options, args);
		if(cmd.hasOption("configFilePath")){
			configFilePath = cmd.getOptionValue("configFilePath");
		}
		
		if(!cmd.hasOption("sqlUri") || !cmd.hasOption("bucket")){
			System.out.println("Missing required parameters: sqlUri, bucket (usage: ant run -Dargs='sqlUri=xxx bucket=yyy')");
		}
		
		conf = (Map)Yaml.load(new File(configFilePath));
		    
		//Getting sql from S3	
		S3SqlFileReader sqlReader = new S3SqlFileReader((String)cmd.getOptionValue("sqlUri"), (String)cmd.getOptionValue("bucket"));
		sqlReader.setConfigFilePath(configFilePath);
		String sql = sqlReader.getSQLFromS3();
	    
		System.out.println("Running query: "+sql);
	    //Now, query database with sql
		Connection conn = null;
        Statement stmt = null;
        try{
           Class.forName("org.postgresql.Driver");
           Properties props = new Properties();
           props.setProperty("user", (String)conf.get("redshiftUsername"));
           props.setProperty("password", (String)conf.get("redshiftPassword"));
           conn = DriverManager.getConnection((String)conf.get("redshiftHost"), props);
        
           System.out.println("Connected to: "+(String)conf.get("redshiftHost"));
           stmt = conn.createStatement();
           stmt.execute(sql);
           
           stmt.close();
           conn.close();
           System.exit(1);
        }catch(Exception ex){
           //For convenience, handle all errors here.
           ex.printStackTrace();
        }finally{
           //Finally block to close resources.
           try{
              if(stmt!=null)
                 stmt.close();
           }catch(Exception ex){
           }// nothing we can do
           try{
              if(conn!=null)
                 conn.close();
           }catch(Exception ex){
              ex.printStackTrace();
           }
        }
        System.out.println("Finished connectivity test.");
     }
	}


