package com.softgraf.control;

import static com.softgraf.control.Principal.clienteDAO;
import static com.softgraf.control.Sistema.dlgErro;
import static com.softgraf.control.Sistema.dlgInfo;

import java.util.Arrays;

import com.softgraf.model.Aceitar;
import com.softgraf.model.Cep;
import com.softgraf.model.ClienteProperty;
import com.softgraf.model.CpfCnpj;
import com.softgraf.model.Email;
import com.softgraf.model.Estados;
import com.softgraf.model.Telefone;

import javafx.fxml.FXML;
import javafx.scene.control.Button;
import javafx.scene.control.ChoiceBox;
import javafx.scene.control.Label;
import javafx.scene.control.RadioButton;
import javafx.scene.control.TextField;
import javafx.scene.control.ToggleGroup;
import javafx.scene.layout.AnchorPane;

public class ControleCliente {

	@FXML
	private AnchorPane painelCliente;
	@FXML
	private TextField txtCodigo, txtNome, txtCpfCnpj, txtEmail, txtTelefone,
					  txtCidade, txtCep, txtRua, txtBairro;
	@FXML
	private RadioButton radPF, radPJ;
	@FXML
	private ChoiceBox<String> cmbEstado;
	@FXML
	private Button btnSalvar, btnReset, btnFechar;
	@FXML
	private Label lblModo;
	
	private ToggleGroup grupo = new ToggleGroup();
	
	private static ClienteProperty cliente = null;
	private static Modo modo = Modo.INCLUSAO;
	
	@FXML
	public void initialize(){
		if (cliente == null){
			cliente = new ClienteProperty();
		}
		
		// codigo é o id da tabela cliente
		if (cliente.getCodigo() > 0){
			txtCodigo.setText(cliente.getCodigo().toString());
		}
		
		txtCodigo.setEditable(false);
		txtCodigo.setFocusTraversable(false);
		txtCodigo.setStyle("-fx-highlight-fill: null; -fx-highlight-text-fill: null");
		
		radPF.setToggleGroup(grupo);
		radPJ.setToggleGroup(grupo);
		
		if (cliente.getTipo() == 'F'){
			radPF.setSelected(true);
			txtCpfCnpj.setPromptText("123456789-00");			
		} else {
			radPJ.setSelected(true);
			txtCpfCnpj.setPromptText("12345678/0001-00");
		}
		
		cmbEstado.setItems(Estados.listar());
		cmbEstado.setValue(cliente.getEstado());
		
		txtNome.setText(cliente.getNome());
		txtCpfCnpj.setText(cliente.getCpfCnpj());
		txtEmail.setText(cliente.getEmail());
		txtTelefone.setText(cliente.getFone());
		txtCidade.setText(cliente.getCidade());
		txtCep.setText(cliente.getCep());
		txtRua.setText(cliente.getRua());
		txtBairro.setText(cliente.getBairro());
		
		txtNome.focusedProperty().addListener(Void -> txtNome.setText(txtNome.getText().toUpperCase().trim()));
		txtEmail.focusedProperty().addListener(Void -> Email.formatar(txtEmail));
		txtCidade.focusedProperty().addListener(Void -> txtCidade.setText(txtCidade.getText().toUpperCase().trim()));
		txtRua.focusedProperty().addListener(Void -> txtRua.setText(txtRua.getText().toUpperCase().trim()));
		txtBairro.focusedProperty().addListener(Void -> txtBairro.setText(txtBairro.getText().toUpperCase().trim()));
		
		txtCpfCnpj.focusedProperty().addListener(Void -> CpfCnpj.formatar(txtCpfCnpj,  radPF.isSelected()));		
		txtCpfCnpj.setOnKeyTyped(e -> Aceitar.apenasInteirosPositivos(e, CpfCnpj.MAX));
		
		radPF.focusedProperty().addListener(Void -> {
			CpfCnpj.formatar(txtCpfCnpj, true);
			txtCpfCnpj.setPromptText("123456789-00");
		});
		
		radPJ.focusedProperty().addListener(Void -> {
			CpfCnpj.formatar(txtCpfCnpj, false);
			txtCpfCnpj.setPromptText("12345678/0001-00");
		});
		
		txtTelefone.focusedProperty().addListener(Void -> Telefone.formatar(txtTelefone));
		txtTelefone.setOnKeyTyped(e -> Aceitar.apenasInteirosPositivos(e, Telefone.MAX));
		
		txtCep.focusedProperty().addListener(Void -> Cep.formatar(txtCep));
		txtCep.setOnKeyTyped(e -> Aceitar.apenasInteirosPositivos(e, Cep.MAX));
		
		btnSalvar.setOnAction(e -> cadastrarCliente());
		btnReset.setOnAction(e -> resetarFormulario());
	
		btnFechar.setOnAction(e -> {
			ControleCliente.setModo(null, Modo.INCLUSAO);
			ControlePrincipal.atualizaPainelAtual(null);
		});
		
		lblModo.setText(modo.toString());
		if (modo == Modo.ALTERACAO){
			btnSalvar.setText("Atualizar");
			btnReset.setDisable(true);
			btnSalvar.setOnAction(e -> atualizarCliente());
		} else if (modo == Modo.CONSULTA){
			desabilitarFormulario();
		}
		
	}
	
	private boolean validarFormulario(){
		if (txtNome.getText().trim().length() < 4){
			txtNome.requestFocus();
			return false;
		} else if (txtCidade.getText().trim().length() < 3){
			txtCidade.requestFocus();
			return false;
		} else {
			cliente.tipo(radPF.isSelected() ? 'F' : 'J')
				.nome(txtNome.getText())
				.cpfCnpj(txtCpfCnpj.getText())
				.email(txtEmail.getText())
				.fone(txtTelefone.getText())
				.cidade(txtCidade.getText())
				.estado(cmbEstado.getValue())
				.cep(txtCep.getText())
				.rua(txtRua.getText())
				.bairro(txtBairro.getText());
		}
		
		return true;
	}
	
	
	private void cadastrarCliente(){
		if (validarFormulario()){
			
			if (clienteDAO.inserir(cliente)){
				dlgInfo.setHeaderText("SUCESSO!");
				dlgInfo.setContentText("Cliente cadastrado com sucesso.");
				dlgInfo.showAndWait();
			} else {
				dlgErro.setContentText("ERRO!");
				dlgErro.setContentText("Erro ao cadastrar cliente.");
				dlgErro.showAndWait();
			}
		}
	}
	
	private void atualizarCliente(){
		if (validarFormulario()){
			
			if (clienteDAO.atualizar(cliente.getCodigo(), cliente)){
				dlgInfo.setHeaderText("SUCESSO!");
				dlgInfo.setContentText("Cliente atualizado com sucesso.");
				dlgInfo.showAndWait();
			} else {
				dlgErro.setContentText("ERRO!");
				dlgErro.setContentText("Erro ao atualizar cliente.");
				dlgErro.showAndWait();
			}
		}
	}
	
	private void resetarFormulario(){
		txtNome.setText("");
		txtCpfCnpj.setText("");
		txtEmail.setText("");
		txtTelefone.setText("");
		txtCidade.setText("");
		txtCep.setText("");
		txtRua.setText("");
		txtBairro.setText("");
	}
	
	// ClienteProperty c são os dados da tela cliente
	public static void setModo(ClienteProperty c, Modo m){
		cliente = c;
		modo = m;
	}
	
	private void desabilitarFormulario(){
		Arrays.asList(radPF, radPJ, txtNome, txtCpfCnpj, txtEmail,
				txtTelefone, cmbEstado, txtCidade, txtCep, txtRua,
				txtBairro, btnSalvar, btnReset)
			.forEach(c -> {
				if (c instanceof TextField) {
					((TextField) c).setEditable(false);
					((TextField) c).setStyle("-fx-highlight-fill: null; -fx-highlight-text-fill: null;"); 
				} else
					c.setDisable(true);
			});
	}
	
}
