package br.com.elotech.websaude.odontograma.ui.tratamento;

import br.com.elotech.websaude.odontograma.backend.model.OdontoTratamentoModel;
import br.com.elotech.websaude.odontograma.backend.model.TratamentoHistoricoBean;
import br.com.elotech.websaude.odontograma.ui.Application;
import br.com.elotech.websaude.odontograma.ui.odontograma.Modo;
import br.com.elotech.websaude.odontograma.ui.odontograma.OdontogramaView;
import br.com.elotech.websaude.odontograma.ui.odontograma.ReportView;
import com.vaadin.event.ShortcutAction;
import com.vaadin.icons.VaadinIcons;
import com.vaadin.ui.*;
import com.vaadin.ui.themes.ValoTheme;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

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

public class TratamentoView extends VerticalLayout {

    Button btnNovoTratamento = new Button("Nova Avaliação");
    static OdontogramaView odontogramaView;
    static OdontoTratamentoModel tratamentoModel;


    static List<TratamentoHistoricoBean> tratamentos = new ArrayList();

    public TratamentoView() {

        setWidth("100%");
        configurarBotoes();
        try {
            preencherBancoDados();
        } catch (SQLException e) {
            e.printStackTrace();
        }
        carregarHistoricoTratamentos();

    }


    private void preencherBancoDados() throws SQLException {

        tratamentoModel = new OdontoTratamentoModel();
        ResultSet rs = tratamentoModel.listaTratamentos(Integer.valueOf(Application.args[3]));
        tratamentos.clear();
        while(rs.next()){
            TratamentoHistoricoBean t = TratamentoHistoricoBean.builder()
                    .codigo(rs.getLong("odo_trat_codigo"))
                    .status(rs.getString("odo_trat_status"))
                    .build();
            t.setDataInicial(rs.getDate("odo_trat_dtinicial"));
            t.setDataInicialTratamento(rs.getDate("odo_trat_dtinicial_tratamento"));
            t.setDataFinal(rs.getDate("odo_trat_dtfinal"));
            t.setDataFinalExame(rs.getDate("odo_trat_dtfinal_exame"));
            tratamentos.add(t);
        }
    }

    private void configurarBotoes() {

        btnNovoTratamento.setIcon(VaadinIcons.PLUS_CIRCLE);
        btnNovoTratamento.setClickShortcut(ShortcutAction.KeyCode.N,ShortcutAction.ModifierKey.CTRL);
        btnNovoTratamento.setStyleName(ValoTheme.BUTTON_PRIMARY);

        HorizontalLayout layout = new HorizontalLayout();
        layout.setSpacing(true);
        layout.setWidth("100%");

        layout.addComponents(btnNovoTratamento);
        layout.setComponentAlignment(btnNovoTratamento, Alignment.TOP_RIGHT);

        addComponent(layout);
        layout.setHeight("30px");
        setComponentAlignment(layout,Alignment.TOP_RIGHT);

        btnNovoTratamento.addClickListener(e -> {
            try {
                abrirTratamento(Modo.AVALIACAO);
            } catch (SQLException e1) {
                e1.printStackTrace();
            }
        });

    }

    private void carregarHistoricoTratamentos() {

        Grid<TratamentoHistoricoBean> grid = new Grid("Tratamentos");

        grid.setStyleName("fonte-menor");

        grid.addColumn(TratamentoHistoricoBean::getCodigo)
                .setCaption("Código").setMinimumWidthFromContent(true).setWidth(80)
                .setStyleGenerator(item -> "v-align-right");
        grid.addColumn(TratamentoHistoricoBean::getDataInicialFormatado).setCaption("Dt Ini Exame");
        grid.addColumn(TratamentoHistoricoBean::getDataFinalExameFormatado).setCaption("Dt Final Exame");
        grid.addColumn(TratamentoHistoricoBean::getDataInicialTratamentoFormatado).setCaption("Dt Ini Trat.");
        grid.addColumn(TratamentoHistoricoBean::getDataFinalFormatado).setCaption("Dt Final Trat.");
        grid.addColumn(TratamentoHistoricoBean::getStatus).setCaption("Status").setWidth(100);

        Grid.Column columnVisualizar = grid.addComponentColumn(
                p -> new VisualizarButton("Imprimir",e->{
                    try {
                        abrirTratamentoReport(p.getCodigo().intValue(),true,Modo.CONSULTA);
                    } catch (SQLException e1) {
                        e1.printStackTrace();
                    }
                })
        );

        columnVisualizar.setMinimumWidthFromContent(true);
        columnVisualizar.setWidth(152);

        Grid.Column columnExame = grid.addComponentColumn(
                p -> new AbrirButton(
                        "Avaliar",
                        e->{
                            try {
                                abrirTratamento(p.getCodigo().intValue(),false,Modo.AVALIACAO);
                            } catch (SQLException e1) {
                                e1.printStackTrace();
                            }
                        })
        );

        Grid.Column columnTratamento = grid.addComponentColumn(
                p -> new AbrirButton(
                        "Tratamento",
                        e->{
                            try {
                                new OdontoTratamentoModel().reabrir(p.getCodigo());
                                abrirTratamento(p.getCodigo().intValue(),false,Modo.TRATAMENTO);

                                CONN.prepareStatement("UPDATE odonto_tratamento SET odo_trat_dtinicial_tratamento=now() WHERE odo_trat_dtinicial_tratamento is null AND odo_trat_codigo=" + p.getCodigo()).executeUpdate();
                                CONN.commit();

                            } catch (SQLException e1) {
                                e1.printStackTrace();
                            }
                        })
        );

        columnExame.setMinimumWidthFromContent(true);
        columnTratamento.setMinimumWidthFromContent(true);
        columnExame.setWidth(130);
        columnTratamento.setWidth(165);
        grid.setStyleName(ValoTheme.TABLE_SMALL);
        grid.setItems(tratamentos);
        grid.setSelectionMode(Grid.SelectionMode.NONE);
        grid.setWidth("100%");
        grid.setHeight("100%");

        addComponent(grid);

    }

    private void abrirTratamento(int codigo, boolean somenteConsulta, Modo modo) throws SQLException {
        odontogramaView = new OdontogramaView(modo);
        odontogramaView.setModo(modo);
        odontogramaView.changeEvent(codigo,somenteConsulta);

        UI.getCurrent().setContent(odontogramaView.getCustom());
    }
    private void abrirTratamentoReport(int codigo, boolean somenteConsulta, Modo modo) throws SQLException {
        ReportView reportView = new ReportView(modo);
        reportView.setModo(modo);
        reportView.changeEvent(codigo,somenteConsulta);

        UI.getCurrent().setContent(reportView.getCustom());
    }

    private void abrirTratamento(Modo modo) throws SQLException {
        tratamentoModel = new OdontoTratamentoModel();
        int tratCodigo = tratamentoModel.abrir();

        odontogramaView = new OdontogramaView(modo);
        odontogramaView.setModo(modo);

        odontogramaView.changeEvent(tratCodigo,false);

        UI.getCurrent().setContent(odontogramaView.getCustom());
        odontogramaView.recarregar();
    }

}
