package com.softgraf.vendas.control;

import java.util.List;

import com.softgraf.vendas.model.dao.ClienteDAO;
import com.softgraf.vendas.model.pojo.Cliente;
import com.softgraf.vendas.model.pojo.Endereco;
import com.softgraf.vendas.view.TableViewHelper;

import javafx.beans.property.StringProperty;
import javafx.beans.value.ChangeListener;
import javafx.beans.value.ObservableValue;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.event.Event;
import javafx.event.EventHandler;
import javafx.fxml.FXML;
import javafx.scene.control.ComboBox;
import javafx.scene.control.Label;
import javafx.scene.control.TableView;
import javafx.scene.control.TextField;
import javafx.scene.input.KeyEvent;

public class ControleCliente extends AbstractController<Cliente>{

	// injeção de dependência
	@FXML private TextField txtId, txtNome, txtIdEndereco;
	@FXML private ComboBox<Endereco> cmbEndereco;
	private static ComboBox<Endereco> staticCmbEndereco;
	@FXML private Label lblMensagem;
	@FXML private TableView<ObservableList<StringProperty>> clienteTableView;
	private TableViewHelper<Cliente> tableViewHelper;
	private static ClienteDAO clienteDAO = null;
	
	// evento de inicialização da tela
	// este método é chamado assim que a tela está pronta para ser exibida
	@FXML
	@Override
	public void initialize() {
		clienteDAO = VendasPrincipal.getClienteDAO();
		cmbEndereco.getItems().addAll(clienteDAO.getEnderecoDAO().listar());
		staticCmbEndereco = cmbEndereco;
		
		cmbEndereco.valueProperty().addListener(new ChangeListener<Endereco>() {
			@Override
			public void changed(ObservableValue<? extends Endereco> observable, Endereco anterior, Endereco atual) {
				if (atual != null)
					txtIdEndereco.setText(Integer.toString(atual.getId()));
			}
		});
		
		String sqlSelect = "SELECT c.ID, c.Nome, e.Rua, e.Cidade, e.Estado FROM Cliente AS c, Endereco AS e WHERE c.Endereco_ID = e.ID";
		tableViewHelper = new TableViewHelper<>(clienteTableView, clienteDAO, sqlSelect);
		
		clienteTableView.setOnMouseClicked(e -> {
			String id = tableViewHelper.getValorSelecionado(0);
			if (id != null) {
				if (e.getClickCount() == 1)
					preencherCampos(clienteDAO.buscar(Integer.parseInt(id)));
				else  // duplo clique
					excluir(clienteDAO, id, lblMensagem, tableViewHelper);
			}
		});

	}

	@Override
	protected void preencherCampos(Cliente cliente){
		txtId.setText(cliente.getId().toString());
		txtNome.setText(cliente.getNome());
		txtIdEndereco.setText(cliente.getEndereco().getId().toString());
		cmbEndereco.setValue(cliente.getEndereco());
	}
	
	@Override
	public void acaoNovo() {
		super.limparCampos(txtId, txtNome, txtIdEndereco, cmbEndereco);
	}
	
	@Override
	public void acaoSalvarAtualizar() {
	    Cliente cliente = null;
		boolean sucesso = false;
			
		String nome = txtNome.getText();
		String txtEnderecoId = txtIdEndereco.getText();
			
		if (txtEnderecoId.isEmpty()){
			lblMensagem.setText("Você esqueceu de escolher o endereço");
			return;
		}
			
		Integer enderecoId = Integer.parseInt(txtEnderecoId);
		Endereco endereco = clienteDAO.getEnderecoDAO().buscar(enderecoId);
			
		if (!txtId.getText().isEmpty()) {
			Integer id = Integer.parseInt(txtId.getText());
			cliente = clienteDAO.buscar(id);
		}
			
		// atualiza cliente existente
		if (cliente != null){
			cliente.setNome(nome);
			cliente.setEndereco(endereco);
			sucesso = clienteDAO.atualizar(cliente);
				
		// salva cliente novo
		} else {
			cliente = new Cliente(null, nome, endereco);
			sucesso = clienteDAO.inserir(cliente);
		}
			
		if (sucesso) {
			txtId.setText(cliente.getId().toString());
			tableViewHelper.atualizarDados();
			lblMensagem.setText("Dados salvos/atualizados com sucesso!");
		} else
			lblMensagem.setText("Erro ao salvar/atualizar");
	}

	public static void atualizarEnderecos(){
		if (staticCmbEndereco != null){
			List<Endereco> lista = clienteDAO.getEnderecoDAO().listar();
			staticCmbEndereco.setItems(FXCollections.observableArrayList(lista));
		}
	}
	
    @FXML
    void acaoNome(KeyEvent e) {
    	if (txtNome.getText().length() == 45 || Character.isDigit(e.getCharacter().charAt(0))) {
    		e.consume();
    	}

    }
}
