package com.softgraf.view;

import java.awt.Dimension;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

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.ValidarPk;
import com.softgraf.model.abstrato.Estados;
import com.softgraf.model.dao.AgenciaDAO;
import com.softgraf.model.dao.BancoDAO;
import com.softgraf.model.tabelas.TableModelBanco;
import com.softgraf.model.vo.Agencia;
import com.softgraf.model.vo.Banco;
import com.softgraf.view.abstrato.AbstractGenericView;
import com.softgraf.view.tabelas.TabelaView;
import com.softgraf.view.vcomponentes.VButton;
import com.softgraf.view.vcomponentes.VCampoFone;
import com.softgraf.view.vcomponentes.VCampoNumerico;
import com.softgraf.view.vcomponentes.VCampoTexto;
import com.softgraf.view.vcomponentes.VGrupoComboBox;

// 55
public class AgenciaView extends AbstractGenericView<Agencia, AgenciaDAO>{

	private static final long serialVersionUID = 1L;
	private VCampoNumerico idAgencia, numAgencia, numBanco;
	private VButton btnListar;	
	private VCampoTexto txtNomeBanco, txtNomeAgencia, txtEndereco, txtBairro, txtCidade;
	private VCampoFone txtFone;
	private VGrupoComboBox cmbUF;

	public AgenciaView(JFrame frame, Agencia vo, AgenciaDAO agenciaDAO, BancoDAO bancoDAO, Modo modo) {
		super(frame, new Dimension(700, 300), vo, agenciaDAO, bancoDAO, modo);
	}

	@Override
	protected void inicializaComponentes() {
		idAgencia = new VCampoNumerico("ID:", Limite.IDAGENCIA);
		numAgencia = new VCampoNumerico("Número da agência:", Limite.NUMAGENCIA);
		txtNomeAgencia = new VCampoTexto("Nome da agência:", 175, Limite.NOMEAGENCIA);

		numBanco = new VCampoNumerico("Número do Banco:", Limite.NUMBANCO);
		btnListar = new VButton("Listar Bancos", 115);
		txtNomeBanco = new VCampoTexto("Nome do Banco:", 320, Limite.NOMEBANCO);
		
		txtEndereco = new VCampoTexto("Endereço:", 250, Limite.ENDERECO);
		txtBairro = new VCampoTexto("Bairro:", 175, Limite.BAIRRO);
		
		txtFone = new VCampoFone("Fone:");
		txtCidade = new VCampoTexto("Cidade:", 175, Limite.CIDADE);
		cmbUF = new VGrupoComboBox("Estado:", Estados.listarEstados());
	}

	@Override
	protected void adicionaComponentes() {
		addVComponente(idAgencia, numAgencia, txtNomeAgencia, numBanco, btnListar, txtNomeBanco, txtEndereco, txtBairro, txtFone, txtCidade, cmbUF);
	}

	@Override
	protected void preencheCampos() {
		setCampos(getVo().toArray(), idAgencia, numAgencia, numBanco, txtNomeAgencia, txtEndereco, txtBairro, txtCidade, cmbUF, txtFone);
		txtNomeBanco.setText(retNomeBanco(getVo().getBanco()));
	}

	@Override
	protected void configuraModoEacoes() {
		setEditableFalse(idAgencia, txtNomeBanco); 
					
		if (getModo() != Modo.CONSULTA) {
			setCamposObrigatorios(numAgencia, numBanco);
			numAgencia.addFocusListener(new ValidarInteiro(1));
			numBanco.addFocusListener(new ValidarPk<BancoDAO>(getBancoDAO()));
			btnListar.addActionListener(new AcaoListarBancos());
		}
	}
	
	private class AcaoListarBancos implements ActionListener {
		@Override
		public void actionPerformed(ActionEvent e) {
			TabelaView<Banco, BancoDAO, TableModelBanco> tbl = new TabelaView<>(getJDialog(), "Lista de Bancos", 
															   Cor.TAB_BANCO, getBancoDAO(), new TableModelBanco());
			Banco b = tbl.getVO();
			if (b != null){
				txtNomeBanco.setText(b.getNomeBanco());
				numBanco.setValue(String.valueOf(b.getBanco()));
				numBanco.requestFocus();
			}
		}
	}

	private String retNomeBanco(int numBanco){
		Banco b = getBancoDAO().buscar(numBanco);
		if (b != null){
			return b.getNomeBanco();
		}
		
		return "";
	}
	
	@Override
	protected boolean acaoOK() {
		if (validarCampos(numAgencia, numBanco) && super.acaoOK()) {

			Agencia vo = getVo();			
			vo.setAgencia(numAgencia.getInteiro());
			vo.setBanco(numBanco.getInteiro());
			vo.setNomeAgencia(txtNomeAgencia.getTextoTrim());
			vo.setEndereco(txtEndereco.getTextoTrim());
			vo.setBairro(txtBairro.getTextoTrim());
			vo.setCidade(txtCidade.getTextoTrim());
			vo.setFone(txtFone.getTextoTrim());
			vo.setUf(cmbUF.getItemSelecionado().substring(0, 2));

			return true;
		}
		
		return false;
	}
}
