package br.com.elotech;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

/**
 * Created by elotech on 12/04/17.
 */
public class Process {

    protected final String DRIVER = "org.postgresql.Driver";
    protected static Connection origemDB, destinoDB;
    private String urlOrigem, urlDestino, userOrigem, userDestino, passOrigem, passDestino, SQL;
    protected ResultSet rsOrigem, rsDestino;
    Registro r;
    List<Registro> regs = new ArrayList<>();

    public Connection getOrigemDB() {
        return origemDB;
    }

    public Connection getDestinoDB() {
        return destinoDB;
    }

    public void abrirConexoes() throws ClassNotFoundException, SQLException {
        Class.forName(DRIVER);
        origemDB = DriverManager.getConnection(urlOrigem, userOrigem, passOrigem);
        destinoDB = DriverManager.getConnection(urlDestino, userDestino, passDestino);
    }

    public void addParameters(String urlOrigem, String urlDestino, String userOrigem, String userDestino, String passOrigem, String passDestino) {
        this.urlOrigem = urlOrigem;
        this.urlDestino = urlDestino;
        this.userOrigem = userOrigem;
        this.userDestino = userDestino;
        this.passOrigem = passOrigem;
        this.passDestino = passDestino;
    }

    protected Long countOrigem() {
        try (ResultSet resultSet = origemDB.prepareStatement(SQL).executeQuery()) {
            if (resultSet.next()) {
                Long qtdRegistros = resultSet.getLong(1);
                return resultSet.getLong(1);
            }
        } catch (Exception e) {
            e.printStackTrace();
            return 0L;
        }
        return 0L;
    }

    public List<Registro> processar() throws SQLException {

        try {
            abrirConexoes();
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }

        SQL = "SELECT count(*) FROM siscop.est_item";
        Long qtdRegistros = countOrigem();

        SQL = "SELECT item,"
                + "  unidade,"
                + "  descricao"
                + " FROM siscop.est_item";
        try (ResultSet rsOrigem = origemDB.prepareStatement(SQL).executeQuery()) {

            while (rsOrigem.next()) {
                boolean achou = false;
                SQL = "SELECT pro_codigo,"
                        + "  pro_unidade,"
                        + "  pro_nome,"
                        + "  pro_codigo_elotech"
                        + " FROM social.produto";
                try (ResultSet rsDestino = destinoDB.prepareStatement(SQL).executeQuery()) {

                    while (rsDestino.next()) {

                        if((rsDestino.getInt("pro_codigo_elotech")+"").toUpperCase().equals(rsOrigem.getString("descricao").toUpperCase())){
                            r = new Registro();
                            r.setCodDestino(rsDestino.getInt("pro_codigo"));
                            r.setCodOrigem(rsOrigem.getString("item"));
                            r.setProdutoDestino(rsDestino.getString("pro_nome"));
                            r.setProdutoOrigem(rsOrigem.getString("descricao"));
                            r.setUnidadeOrigem(rsOrigem.getString("unidade"));
                            r.setUnidadeDestino(rsDestino.getString("pro_unidade"));
                            r.setManter("Origem");
                            r.setOperacao("Modificar");
                            regs.add(r);
                            achou = true;
                            break;
                        }else if (rsDestino.getString("pro_nome").length() > 0) {
                            if (rsOrigem.getString("descricao").toUpperCase().contains(rsDestino.getString("pro_nome").toUpperCase())) {
                                //Nada a fazer
                                r = new Registro();
                                r.setCodDestino(rsDestino.getInt("pro_codigo"));
                                r.setCodOrigem(rsOrigem.getString("item"));
                                r.setProdutoDestino(rsDestino.getString("pro_nome"));
                                r.setProdutoOrigem(rsOrigem.getString("descricao"));
                                r.setUnidadeOrigem(rsOrigem.getString("unidade"));
                                r.setUnidadeDestino(rsDestino.getString("pro_unidade"));
                                r.setManter("Origem");
                                r.setOperacao("Modificar");
                                regs.add(r);
                                achou = true;
                                break;
                            }
                        }
                    }
                }
                if (!achou) {
                    r = new Registro();
                    r.setCodDestino(0);
                    r.setCodOrigem(rsOrigem.getString("item"));
                    r.setProdutoDestino(rsOrigem.getString("descricao"));
                    r.setProdutoOrigem(rsOrigem.getString("descricao"));
                    r.setUnidadeOrigem(rsOrigem.getString("unidade"));
                    r.setManter("Origem");
                    r.setOperacao("Novo");
                    regs.add(r);
                    achou = true;
                }

            }
//                        else{
//                            //Alteração no nome update
//                            r = new Registro();
//                            r.setCodDestino(rsDestino.getInt("pro_codigo"));
//                            r.setCodOrigem(rsOrigem.getString("item"));
//                            r.setProdutoDestino(rsDestino.getString("pro_nome"));
//                            r.setProdutoOrigem(rsOrigem.getString("descricao"));
//                            r.setUnidadeOrigem(rsOrigem.getString("unidade"));
//                            r.setUnidadeDestino(rsDestino.getString("pro_unidade"));
//                            r.setManter(1);
//                            r.setOperacao("Modificar");
//                            regs.add(r);
//                            achou = true;
//                            break;
//                        }

        }

        return regs;
    }

}
