package br.com.elotech.websaude.odontograma.backend.model;

import br.com.elotech.websaude.odontograma.ui.Application;

import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.List;

import static br.com.elotech.websaude.odontograma.backend.model.dao.Conexao.CONN;

/*
Marcações Possíveis
"D" - distal
"L" - lingual
"M" - mesial
"O" - oclusal
"V" - vestibular
*"P" - Pino
*"C" - Coroa
*"E" - Exodontia
 */
public class OdontoProcedimentoModel {
    static PreparedStatement pstmt;
    static String SQL = "";

    public ResultSet listaProcedimentos(Integer tratCodigo) throws SQLException {
        SQL = "SELECT odp.odo_proc_codigo,odp.odo_proc_dentenum,odp.odo_proc_denteface,odp.odo_proc_denteanot," +
                "odp.odo_proc_dtprogramada,proc.proc_nome " +
                "FROM odonto_procedimentos odp " +
                "INNER JOIN procedimento proc ON odp.proc_codigo=proc.proc_codigo " +
                "INNER JOIN odonto_procedimentos_controle odpc ON odp.odo_pcon_codigo=odpc.odo_pcon_codigo " +
                "WHERE odpc.odo_trat_codigo = ? AND " +
                "odp.odo_proc_status = FALSE";

        pstmt = CONN.prepareStatement(SQL);
        pstmt.setInt(1,tratCodigo);
        return pstmt.executeQuery();
    }

    public long salvar(Long tratCodigo, List<OdontogramaProcedimentoBean> beans) throws SQLException{

        ProcedimentoModel proc = new ProcedimentoModel();

        SQL = "DELETE FROM odonto_procedimentos WHERE odo_pcon_codigo=(" +
                "SELECT odo_pcon_codigo " +
                "FROM odonto_procedimentos_controle " +
                "WHERE odo_trat_codigo=?)";
        pstmt = CONN.prepareStatement(SQL);
        pstmt.setLong(1,tratCodigo);
        pstmt.executeUpdate();
        CONN.commit();

        OdontoTratamentoModel tratamentoModel = new OdontoTratamentoModel();
        if(tratCodigo==0)
            tratCodigo = Long.valueOf(tratamentoModel.salvarTratamentoAction());

        SQL = "SELECT odo_pcon_codigo FROM odonto_procedimentos_controle WHERE odo_trat_codigo=? ORDER BY odo_pcon_codigo DESC LIMIT 1";
        pstmt = CONN.prepareStatement(SQL);
        pstmt.setLong(1,tratCodigo);
        ResultSet rs = pstmt.executeQuery();
        Long odoPconCodigo = 0L;
        if(rs.next())
            odoPconCodigo = rs.getLong("odo_pcon_codigo");
        else{
            SQL = "INSERT INTO odonto_procedimentos_controle(odo_trat_codigo,ate_codigo) VALUES(?,?)";
            pstmt = CONN.prepareStatement(SQL);
            pstmt.setLong(1,tratCodigo);
            pstmt.setLong(2,Long.valueOf(Application.args[7]));
            pstmt.executeUpdate();
            CONN.commit();
            SQL = "SELECT odo_pcon_codigo FROM odonto_procedimentos_controle WHERE odo_trat_codigo=? ORDER BY odo_pcon_codigo DESC LIMIT 1";
            pstmt = CONN.prepareStatement(SQL);
            pstmt.setLong(1,tratCodigo);
            rs = pstmt.executeQuery();
            if(rs.next())
                odoPconCodigo = rs.getLong("odo_pcon_codigo");
        }



        int count = 1;

        for(OdontogramaProcedimentoBean bean : beans){

            SQL = "INSERT INTO odonto_procedimentos(" + (bean.odoProcCodigo!=null?(bean.odoProcCodigo!=0?"proc_codigo,":""):"")+
                    (bean.odoProcDentenum!=null?"odo_proc_dentenum,":"")+"odo_proc_denteface,odo_proc_denteanot, " +
                    "odo_proc_marcacao, odo_proc_sextante, odo_proc_status,odo_pcon_codigo) " +
                    "VALUES("+(bean.odoProcCodigo!=null?(bean.odoProcCodigo!=0?"?,":""):"")+(bean.odoProcDentenum!=null?"?,":"")+"?,?,?,?,?,?)";

            pstmt = CONN.prepareStatement(SQL);

            if(bean.odoPrealMarcacao!=null)
            if(bean.odoPrealMarcacao.contains("D")||
                    bean.odoPrealMarcacao.contains("V")||
                    bean.odoPrealMarcacao.contains("M")||
                    bean.odoPrealMarcacao.contains("L")) {
                bean.odoProcDenteface = bean.odoPrealMarcacao;
                bean.odoPrealMarcacao = "";
            }

            if(bean.odoProcCodigo!=null)
                if(bean.odoProcCodigo!=0)
                    pstmt.setLong(count++, bean.odoProcCodigo);
            if(bean.odoProcDentenum!=null)
                pstmt.setLong(count++, bean.odoProcDentenum);
                pstmt.setString(count++, bean.odoProcDenteface);
                pstmt.setString(count++, bean.odoProcDenteanot);
                pstmt.setString(count++, bean.odoPrealMarcacao);
                pstmt.setString(count++, bean.odoPrealSextante);
                if(bean.realizado==null)
                    pstmt.setBoolean(count++, false);
                else
                    pstmt.setBoolean(count++, bean.realizado);
                pstmt.setLong(count++, odoPconCodigo);
                //if(bean.odoProcCodigo!=0)
                    pstmt.executeUpdate();
            //}
            count = 1;
        }

        CONN.commit();

        return tratCodigo;

    }

}
