package com.softgraf.view;

import java.awt.Dimension;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.FocusAdapter;
import java.awt.event.FocusEvent;
import java.util.Date;

import javax.swing.JFormattedTextField;
import javax.swing.JFrame;

import com.softgraf.control.Cor;
import com.softgraf.control.Limite;
import com.softgraf.control.Modo;
import com.softgraf.control.listeners.ValidarInteiro;
import com.softgraf.control.listeners.ValidarMoeda;
import com.softgraf.control.listeners.ValidarPk;
import com.softgraf.model.dao.AgenciaDAO;
import com.softgraf.model.dao.BancoDAO;
import com.softgraf.model.dao.ChequeDAO;
import com.softgraf.model.dao.ClienteDAO;
import com.softgraf.model.dao.FinalidadeDAO;
import com.softgraf.model.tabelas.TableModelAgencia;
import com.softgraf.model.tabelas.TableModelCliente;
import com.softgraf.model.tabelas.TableModelFinalidade;
import com.softgraf.model.vo.Agencia;
import com.softgraf.model.vo.Banco;
import com.softgraf.model.vo.Cheque;
import com.softgraf.model.vo.Cliente;
import com.softgraf.model.vo.Finalidade;
import com.softgraf.view.abstrato.AbstractGenericView;
import com.softgraf.view.tabelas.TabelaView;
import com.softgraf.view.vcomponentes.VButton;
import com.softgraf.view.vcomponentes.VCampoData;
import com.softgraf.view.vcomponentes.VCampoMoeda;
import com.softgraf.view.vcomponentes.VCampoNumerico;
import com.softgraf.view.vcomponentes.VCampoTexto;
import com.softgraf.view.vcomponentes.VGrupoCheckBox;
import com.softgraf.view.vcomponentes.VGrupoRadioButton;

// 57
public class ChequeView extends AbstractGenericView<Cheque, ChequeDAO>{

	private static final long serialVersionUID = 1L;
	private VCampoNumerico idCheque, idAgencia, idCliente, idFinalidade, numConta, numCheque, numTotalFolhas, numFolha;
	private VButton btnListarAgencias, btnListarClientes, btnListarFinalidades;
	private VCampoTexto txtBanco, txtCliente, txtDescFinalidade;
	private VCampoMoeda moedaValor;
	private VCampoData dataDesde, dataEmissao, dataBomPara; 
	private VGrupoCheckBox grupoCheckHistorico;
	private VGrupoRadioButton grupoRadioUso;

	

	public ChequeView(JFrame frame, Cheque vo, ChequeDAO dao, BancoDAO bancoDAO, AgenciaDAO agenciaDAO, 
			          ClienteDAO clienteDAO, FinalidadeDAO finalidadeDAO, Modo modo) {
		
		super(frame, new Dimension(700, 500), vo, dao, bancoDAO, agenciaDAO, clienteDAO, finalidadeDAO, modo);
	}

	@Override
	protected void inicializaComponentes() {
		Cheque c = getVo();
		
		idCheque = new VCampoNumerico("ID:", Limite.IDCHEQUE);
		idAgencia = new VCampoNumerico("ID Agência:", Limite.IDAGENCIA);
		btnListarAgencias = new VButton("Agências");
		txtBanco = new VCampoTexto("nomeBanco", 210, Limite.NOMEBANCO, false);
		numConta = new VCampoNumerico("N. Conta:", Limite.NUMCONTA);
		numCheque = new VCampoNumerico("N. Cheque:", Limite.NUMCHEQUE);	
		moedaValor = new VCampoMoeda("Valor R$:", "##,###.00", c.getValor());
		idCliente = new VCampoNumerico("ID Cliente:", Limite.IDCLIENTE);
		btnListarClientes = new VButton("Clientes");
		txtCliente = new VCampoTexto("nomeCliente", 210, Limite.NOMECLIENTE, false);
		dataDesde = new VCampoData("Data Desde:", c.getDataDesde());
		dataEmissao = new VCampoData("Data Emissão:", c.getDataEmissao());
		dataBomPara = new VCampoData("Data Bom Para:", c.getDataBomPara());
		grupoCheckHistorico = new VGrupoCheckBox("Histórico:", getVo().getHistorico(), 
					"Depositado", "Voltou", "Reapresentado", "Voltou 2X", "Trocado");
		numTotalFolhas = new VCampoNumerico("Total de Folhas:", Limite.FOLHAS);
		numFolha = new VCampoNumerico("Folha N.:", Limite.FOLHAS);
		grupoRadioUso = new VGrupoRadioButton("Uso:", getVo().isUso() ? 0 : 1, "Depositar", "Trocar");
		idFinalidade = new VCampoNumerico("ID Finalidade:", Limite.IDFINALIDADE);
		btnListarFinalidades = new VButton("Finalidades", 115);
		txtDescFinalidade = new VCampoTexto("descFinalidade", 360, Limite.DESCFINALIDADE, false);
	}

	@Override
	protected void adicionaComponentes() {
		addVComponente(idCheque, idAgencia, btnListarAgencias, txtBanco, numConta, numCheque, moedaValor, idCliente, 
					   btnListarClientes, txtCliente, dataDesde, dataEmissao, dataBomPara, grupoCheckHistorico, 
					   numTotalFolhas, numFolha, grupoRadioUso, idFinalidade, btnListarFinalidades, txtDescFinalidade);
	}

	
	@Override
	protected void preencheCampos() { 
		setCampos(getVo().toArray(), idCheque, idAgencia, numConta, numCheque, idCliente, null,
									 numTotalFolhas, numFolha, idFinalidade);
				
		txtBanco.setText(retNomeBanco(getVo().getIdAgencia()));
		txtCliente.setText(retNomeCliente(getVo().getIdCliente()));
		txtDescFinalidade.setText(retDescFinalidade(getVo().getIdFinalidade()));
	}
	
	
	@Override
	protected void configuraModoEacoes() {
		setEditableFalse(idCheque, txtBanco, txtCliente, txtDescFinalidade);
		
		if (getModo() != Modo.CONSULTA){
			setCamposObrigatorios(idAgencia, numConta, numCheque, moedaValor, idCliente, idFinalidade, 
								  dataDesde, dataEmissao, dataBomPara, numTotalFolhas, numFolha);
			
			idAgencia.addFocusListener(new ValidarPk<AgenciaDAO>(getAgenciaDAO()));
			btnListarAgencias.addActionListener(new AcaoListarAgencias());
			
			numConta.addFocusListener(new ValidarInteiro(1));
			numCheque.addFocusListener(new ValidarInteiro(1));
			moedaValor.addFocusListener(new ValidarMoeda(1));
			
			idCliente.addFocusListener(new ValidarPk<ClienteDAO>(getClienteDAO()));
			btnListarClientes.addActionListener(new AcaoListarClientes());
			
			dataDesde.addFocusListener(new AcaoDataDesde());
			dataEmissao.addFocusListener(new AcaoDataEmissao());
			dataBomPara.addFocusListener(new AcaoDataBomPara());
			
			numTotalFolhas.addFocusListener(new AcaoTotalFolhas());
			numFolha.addFocusListener(new AcaoNumFolha());
			
			idFinalidade.addFocusListener(new ValidarPk<FinalidadeDAO>(getFinalidadeDAO()));
			btnListarFinalidades.addActionListener(new AcaoListarFinalidades());
			
		}
	}
	
	private class AcaoListarAgencias implements ActionListener {
		@Override
		public void actionPerformed(ActionEvent e) {
			TabelaView<Agencia, AgenciaDAO, TableModelAgencia> tbl = new TabelaView<>(getJDialog(), 
						"Lista de Agências", Cor.TAB_AGENCIA, getAgenciaDAO(), new TableModelAgencia(4));
			Agencia a = tbl.getVO();
			if (a != null){
				idAgencia.setValue(String.valueOf(a.getIdAgencia()));
				txtBanco.setText(getNomeBanco(a));
				idAgencia.requestFocus();
			}
		}
	}
	
	private class AcaoListarClientes implements ActionListener {
		@Override
		public void actionPerformed(ActionEvent e) {
			TabelaView<Cliente, ClienteDAO, TableModelCliente> tbl = new TabelaView<>(getJDialog(),
						"Lista de Clientes", Cor.TAB_CLIENTE, getClienteDAO(), new TableModelCliente(3));
			Cliente c = tbl.getVO();
			if (c != null){
				idCliente.setValue(String.valueOf(c.getIdCliente()));
				txtCliente.setText(c.getNome());
				idCliente.requestFocus();
			}
		}
	}
	
	
	private class AcaoDataDesde extends FocusAdapter {
		@Override
		public void focusLost(FocusEvent e) {
			long hoje = new Date().getTime();
			long desde = dataDesde.getTime();
			long emissao = dataEmissao.getTime();
			long bompara = dataBomPara.getTime();
			
			if (desde >= hoje || desde >= emissao || desde >= bompara)
				dataDesde.setBackground(Cor.OBRIGATORIO);			
			else
				dataDesde.setBackground(Cor.OK);
		}
	}
	
	
	private class AcaoDataEmissao extends FocusAdapter {
		@Override
		public void focusLost(FocusEvent e) {
			long hoje = new Date().getTime();
			long desde = dataDesde.getTime();
			long emissao = dataEmissao.getTime();
			long bompara = dataBomPara.getTime();
			
			if (emissao <= desde || emissao > bompara || emissao > hoje)
				dataEmissao.setBackground(Cor.OBRIGATORIO);
			else
				dataEmissao.setBackground(Cor.OK);
		}
	}
	
	
	private class AcaoDataBomPara extends FocusAdapter {
		@Override
		public void focusLost(FocusEvent e) {
			long hoje = new Date().getTime();
			long desde = dataDesde.getTime();
			long emissao = dataEmissao.getTime();
			long bompara = dataBomPara.getTime();
			
			if (bompara < emissao || bompara <= desde || (bompara < hoje && getModo() == Modo.INCLUSAO))
				dataBomPara.setBackground(Cor.OBRIGATORIO);			
			else
				dataBomPara.setBackground(Cor.OK);
		}
	}
	
	
	private class AcaoListarFinalidades implements ActionListener {
		@Override
		public void actionPerformed(ActionEvent e) {
			TabelaView<Finalidade, FinalidadeDAO, TableModelFinalidade> tbl =
					new TabelaView<>(getJDialog(), "Lista de Finalidades", 
						Cor.TAB_FINALIDADE, getFinalidadeDAO(), new TableModelFinalidade());
			Finalidade f = tbl.getVO();
			if (f != null){
				idFinalidade.setValue(String.valueOf(f.getIdFinalidade()));
				txtDescFinalidade.setText(f.getDescricao());
				idFinalidade.requestFocus();
			}
		}
	}
	
	
	private class AcaoTotalFolhas extends FocusAdapter {
		@Override
		public void focusLost(FocusEvent e) {
			
			int total = Integer.parseInt(((JFormattedTextField) e.getSource()).getText().trim());
			int nFolha = numFolha.getInteiro();
			
			if (total < 1 || total < nFolha) {
				numTotalFolhas.setBackground(Cor.OBRIGATORIO);
				numTotalFolhas.setValue("1");
			} else {
				numTotalFolhas.setBackground(Cor.OK);
				numTotalFolhas.setValue(String.valueOf(total));
			}
		}
	}
	
	
	private class AcaoNumFolha extends FocusAdapter {
		@Override
		public void focusLost(FocusEvent e) {
			
			int total = numTotalFolhas.getInteiro();
			int nFolha = Integer.parseInt(((JFormattedTextField) e.getSource()).getText().trim());

			if (nFolha < 1 || nFolha > total) {
				numFolha.setBackground(Cor.OBRIGATORIO);
				numFolha.setValue("1");
			} else {
				numFolha.setBackground(Cor.OK);
				numFolha.setValue(String.valueOf(nFolha));
			}
		}
	}
	
	private String getNomeBanco(Agencia a){
		Banco b = getBancoDAO().buscar(a.getBanco());
		if (b != null){
			return b.getNomeBanco();
		}
		
		return "";
	}
	
	private String retNomeBanco(int idAgencia){
		Agencia a = getAgenciaDAO().buscar(idAgencia);
		if (a != null){
			int numBanco = a.getBanco();
			Banco b = getBancoDAO().buscar(numBanco);
			if (b != null){
				return b.getNomeBanco();
			}
		}
		
		return "";
	}
	
	private String retNomeCliente(int idCliente){
		Cliente c = getClienteDAO().buscar(idCliente);
		if (c != null){
			return c.getNome();
		}
		
		return "";
	}
	
	private String retDescFinalidade (int idFinalidade){
		Finalidade f = getFinalidadeDAO().buscar(idFinalidade);
		if (f != null){
			return f.getDescricao();
		}
		
		return "";
	}
	
	@Override
	protected boolean acaoOK() {
		if (validarCampos(idAgencia, numConta, numCheque, moedaValor, idCliente,
				          idFinalidade, numTotalFolhas, numFolha, dataDesde, dataEmissao, 
				          dataBomPara, numTotalFolhas, numFolha) && super.acaoOK()) {

			Cheque vo = getVo();
			vo.setIdAgencia(idAgencia.getInteiro());
			vo.setNumConta(numConta.getInteiro());
			vo.setNumCheque(numCheque.getInteiro());		
			vo.setValor(moedaValor.getValor());
			vo.setIdCliente(idCliente.getInteiro());
			vo.setDataDesde(dataDesde.getDate());
			vo.setDataEmissao(dataEmissao.getDate());
			vo.setDataBomPara(dataBomPara.getDate());
			vo.setHistorico(grupoCheckHistorico.getSelecionado());
			vo.setTotalFolhas(numTotalFolhas.getInteiro());
			vo.setNumFolha(numFolha.getInteiro());
			vo.setUso(grupoRadioUso.getSelecionado() == 0);
			vo.setIdFinalidade(idFinalidade.getInteiro());
			
			return true;
		}
		
		return false;
	}

}
