/*
 * 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;

import br.com.ctecinf.orm.swing.FormPanelController;
import br.com.ctecinf.model.Cliente;
import br.com.ctecinf.model.Crediario;
import br.com.ctecinf.model.Municipio;
import br.com.ctecinf.model.Receita;
import br.com.ctecinf.orm.swing.TablePanelController;
import br.com.ctecinf.autocomplete.AutoCompleteField;
import br.com.ctecinf.swing.Image;
import br.com.ctecinf.autocomplete.AutoCompleteModel;
import br.com.ctecinf.swing.OptionPane;
import java.awt.Component;
import java.sql.Date;
import java.util.Map;
import javax.swing.JScrollPane;
import javax.swing.JTabbedPane;

/**
 *
 * @author Cássio Conceição
 * @since 03/07/2019
 * @version 201907
 * @see http://ctecinf.com.br/
 */
public class ClienteForm extends FormPanelController<Cliente> {

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

    public ClienteForm(Cliente controller) {
        super("Cliente", controller == null ? new Cliente() : controller, 3);
        init();
    }

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

        if (super.save(params)) {

            Receita receita = new Receita();
            receita.setCliente(getController());
            new ReceitaForm(receita).setVisible(true);
            return true;

        } else {
            return false;
        }
    }

    private void init() {

        if (getController().getId() == null) {
            getController().setDataCadastro(new Date(System.currentTimeMillis()));
        }

        AutoCompleteModel<Municipio> municipios = new Municipio().getAutoCompleteModel();

        addRequiredFieldLabel();

        addLine(new AutoCompleteField("nome", getController().getAutoCompleteModel()));

        addColumn("sexo", "estadoCivil", "dataCadastro");

        addColumn("dataNascimento", "cpf", "rg");

        addColumn(new AutoCompleteField("naturalidade", municipios), "salario", "carteiraTrabalho");

        addLine("nomePai");

        addLine("nomeMae");

        addLine("endereco");

        addColumn("bairro", getColumn(), 2);
        addColumn("cep");

        addLine(new AutoCompleteField("municipio", municipios));

        addColumn("fone", 0);
        addColumn("celular", 1);

        // Panel 2
        addTab("Contatos", 3);

        addLine("email");

        addTitle("Empresa");
        addColumn("empresa");
        addColumn("enderecoEmpresa", getColumn(), 2);

        addTitle("Conjuge");

        addColumn("conjuge", getColumn(), 2);
        addColumn("dataNascimentoConjuge");

        addColumn("rgConjuge", "foneConjuge", "celularConjuge");

        addTitle("Conhecido");

        addColumn("conhecido", getColumn(), 2);
        addColumn("foneConhecido");

        addColumn("spc");
        newRow();

        addTitle("Observacao");
        addLine("observacao");

        setFieldsValues();

        JTabbedPane tab = (JTabbedPane) getForm();

        Component receita = null;

        try {

            receita = new JScrollPane(new TablePanelController<Receita>(getController().getTableModel(Receita.class)) {

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

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

        Component crediario = null;

        try {

            crediario = new JScrollPane(new TablePanelController<Crediario>(getController().getTableModel(Crediario.class)) {

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

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

        if (receita != null) {
            tab.add("Receita", receita);
        }

        if (crediario != null) {
            tab.add("Crediario", crediario);
        }

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

        createFrame(TITLE);
    }
}
