package com.softgraf.vendas.control;

import java.util.Arrays;
import java.util.List;

import com.softgraf.vendas.model.entity.Cliente;
import com.softgraf.vendas.model.entity.Endereco;
import com.softgraf.vendas.model.repositorio.RepositorioCliente;
import com.softgraf.vendas.model.repositorio.RepositorioEndereco;
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.fxml.FXML;
import javafx.scene.control.ComboBox;
import javafx.scene.control.Label;
import javafx.scene.control.TableView;
import javafx.scene.control.TextField;

public class ControleCliente extends AbstractController<Cliente>{

	@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 RepositorioCliente repositorioCliente = null;
	private static RepositorioEndereco repositorioEndereco = null;
	

	@FXML
	@Override
	public void initialize() {
		repositorioCliente = VendasPrincipal.getRepositorioCliente();
		repositorioEndereco = VendasPrincipal.getRepositorioEndereco();
		cmbEndereco.getItems().addAll(repositorioEndereco.listarTodos());
		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()));
			}
		});
		
		List<String> colunas = Arrays.asList("ID", "Nome", "Rua", "Cidade", "Estado");
		tableViewHelper = new TableViewHelper<>(clienteTableView, repositorioCliente, colunas);
		
		clienteTableView.setOnMouseClicked(e -> {
			String id = tableViewHelper.getValorSelecionado(0);
			if (id != null) {
				if (e.getClickCount() == 1)
					preencherCampos(repositorioCliente.buscarPorId(id));
				else {  // duplo clique
					excluir(repositorioCliente, id, lblMensagem, tableViewHelper);
					acaoNovo();
				}
			}
		});
	}

	@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 = repositorioEndereco.buscarPorId(enderecoId);
			
		if (!txtId.getText().isEmpty()) {
			cliente = repositorioCliente.buscarPorId(txtId.getText());
		}
			
		// atualiza cliente existente
		if (cliente != null){
			cliente.setNome(nome);
			cliente.setEndereco(endereco);
			sucesso = repositorioCliente.atualizar(cliente);
				
		// salva cliente novo
		} else {
			cliente = new Cliente(nome, endereco);
			sucesso = repositorioCliente.adicionar(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 = repositorioEndereco.listarTodos();
			staticCmbEndereco.setItems(FXCollections.observableArrayList(lista));
		}
	}
}
