/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package br.com.ctecinf.view;

/**
 * Os pacotes 'br.com.ctecinf.CTecInf' e 'br.com.ctecinf.text.*' se encontram no
 * site http://ctecinf.com.br/code
 */
import br.com.ctecinf.Daruma;
import br.com.ctecinf.orm.swing.FormPanelController;
import br.com.ctecinf.model.Crediario;
import br.com.ctecinf.model.Parcela;
import br.com.ctecinf.table.TableModel;
import br.com.ctecinf.orm.swing.TablePanelController;
import br.com.ctecinf.swing.Image;
import br.com.ctecinf.swing.OptionPane;
import br.com.ctecinf.table.Table;
import java.awt.Dimension;
import java.awt.event.FocusEvent;
import java.awt.event.FocusListener;
import java.math.BigDecimal;
import java.sql.Date;
import java.util.Calendar;
import java.util.Locale;
import java.util.Map;
import javax.swing.JFormattedTextField;
import javax.swing.JScrollPane;
import javax.swing.SwingUtilities;

/**
 *
 * @author Cássio Conceição - ctecinf.com.br
 * @version V2017.3
 * @since 30/03/2017 16:45:30
 * @see http://ctecinf.com.br/code
 *
 */
public class CrediarioForm extends FormPanelController<Crediario> implements FocusListener {

    private static final String TITLE = "Cadastro de Crediario";

    private TableModel modelParcelas;

    @Override
    protected boolean print() throws Exception {

        try {
            Daruma.carnet(getController());
            return true;
        } catch (Exception ex) {
            OptionPane.error(ex);
        }

        return false;
    }

    @Override
    protected boolean save(Map params) throws Exception {

        getController().setValues(params);
        getController().save();

        for (Object obj : modelParcelas.getData()) {

            Parcela parcela = (Parcela) obj;

            parcela.setCrediario(getController());
            parcela.save();

        }

        getFrame().dispose();

        return true;
    }

    public CrediarioForm(Crediario controller) {
        super(controller == null ? new Crediario() : controller, 2);
        init();
    }

    private void init() {

        Table parcelaTable = null;

        try {

            modelParcelas = getController().getTableModel(Parcela.class);

            parcelaTable = new TablePanelController<Parcela>(modelParcelas) {

                @Override
                protected FormPanelController<Parcela> getForm(Parcela controller) {
                    return new ParcelaForm(controller);
                }
            }.getTable();

        } catch (Exception ex) {
            OptionPane.error(ex);
        }

        addRequiredFieldLabel();

        addLine("cliente");

        addBreakLine();

        addColumn("dataVenda", "notaFiscal");

        addColumn("valorTotal", "numeroParcelas");

        JScrollPane scroll = new JScrollPane(parcelaTable);
        scroll.setPreferredSize(new Dimension(0, 160));
        addLine(scroll);

        addBreakLine();

        addColumn("dataAviso1", "dataAviso2");

        addLine("observacao");

        addAction("Fechar", Image.parse(Image.CLOSE), (e) -> {
            getFrame().dispose();
        });

        setFieldsValues();

        getComponent("dataVenda").addFocusListener(this);

        getComponent("numeroParcelas").addFocusListener(this);

        getComponent("valorTotal").addFocusListener(this);

        createFrame(TITLE);
    }

    @Override
    public void focusGained(FocusEvent e) {
    }

    @Override
    public void focusLost(FocusEvent e) {

        SwingUtilities.invokeLater(() -> {

            JFormattedTextField dataVenda = getFields().getComponent("dataVenda");
            JFormattedTextField numeroParcelas = getFields().getComponent("numeroParcelas");

            Number numParc = (Number) numeroParcelas.getValue();
            Number vl = (Number) ((JFormattedTextField) getFields().getComponent("valorTotal")).getValue();

            if (vl != null && numParc != null && dataVenda.getValue() != null) {

                BigDecimal prest = BigDecimal.valueOf(vl.doubleValue() / numParc.intValue());

                Calendar cal = Calendar.getInstance(new Locale("pt", "BR"));
                cal.setTimeInMillis(((Date) dataVenda.getValue()).getTime());

                modelParcelas.removeAllRows();

                for (int i = 0; i < numParc.intValue(); i++) {

                    Parcela parcela = new Parcela();
                    parcela.setNumeroParcela(i + 1);
                    parcela.setDataVencimento(new Date(cal.getTimeInMillis()));
                    parcela.setValor(prest);
                    parcela.setDataPagamento(null);
                    parcela.setValorPago(null);

                    modelParcelas.addRow(parcela);

                    cal.add(Calendar.DATE, 30);
                }
            }
        });
    }

}
