package com.softgraf.vendas.view;

import java.io.File;
import java.io.FileNotFoundException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

import javax.xml.parsers.ParserConfigurationException;
import javax.xml.transform.TransformerException;

import com.softgraf.vendas.model.dao.ClienteDAO;
import com.softgraf.vendas.model.dao.ProdutoDAO;
import com.softgraf.vendas.model.pojo.Cliente;
import com.softgraf.vendas.model.pojo.Produto;
import com.softgraf.vendas.model.xml.GravadorXml;

import javafx.scene.control.Alert;
import javafx.scene.control.Alert.AlertType;
import javafx.stage.FileChooser;
import javafx.stage.Stage;

public class XmlView {

	private Stage stage;
	private Alert erro;
	private Alert sucesso;

	public XmlView(Stage stage) {
		this.stage = stage;
		
		sucesso = new Alert(AlertType.INFORMATION);
		sucesso.setTitle("Exportação XML");
		sucesso.setHeaderText("Sucesso!!!");
		
		erro = new Alert(AlertType.ERROR);
		erro.setTitle("Exportação XML");		
	}

	private String nomeArquivoXml(){
		FileChooser chooser = new FileChooser();
		FileChooser.ExtensionFilter filtro = new FileChooser.ExtensionFilter("Arquivos XML", "*.xml");
		chooser.getExtensionFilters().add(filtro);
		chooser.setTitle("Digite o nome do arquivo XML para salvar");
		File arquivo = chooser.showSaveDialog(this.stage);
		return (arquivo != null ? arquivo.toString() : null);
	}
	
	public void exportarProdutos(ProdutoDAO dao) {
		String arquivo = nomeArquivoXml();

		if (arquivo != null) {
			
			// retorna todos os produtos do banco de dados
			List<Produto> listaProdutos = dao.listar();
			
			List<String> listaStr;
			List<List<String>> listaValores = new ArrayList<>();
			
			// converte Produto em lista de Strings
			for (Produto produto : listaProdutos){
				listaStr = new ArrayList<>();
				listaStr.add(produto.getId().toString());
				listaStr.add(produto.getNome());
				listaStr.add(String.format("%.2f", produto.getPreco()));
				// lista com valores das tags a serem gravados no xml
				listaValores.add(listaStr);
			}
			
			// nomes das tags a serem gravadas
			List<String> listaTags = Arrays.asList("id", "nome", "preco");
			
			try {
				GravadorXml xml = new GravadorXml();
				xml.processar(arquivo, "produtos", "produto", listaTags, listaValores);
				sucesso.setContentText("Todos os produtos exportados para o arquivo XML");
				sucesso.showAndWait();

			} catch (ParserConfigurationException | FileNotFoundException | TransformerException e) {
				e.printStackTrace();
				erro.setHeaderText("Erro durante exportação de produtos para arquivo XML");
				erro.setContentText(e.getMessage());
				erro.showAndWait();
			}
		}
	}
	
	public void exportarClientes(ClienteDAO dao) {
		String arquivo = nomeArquivoXml();

		if (arquivo != null) {
			
			// retorna todos os clientes do banco de dados
			List<Cliente> listaClientes = dao.listar();

			List<String> listaStr;
			List<List<String>> listaValores = new ArrayList<>();

			// converte Cliente em lista de Strings
			for (Cliente cliente : listaClientes) {
				listaStr = new ArrayList<>();
				listaStr.add(cliente.getId().toString());
				listaStr.add(cliente.getNome());
				listaStr.add(cliente.getEndereco().getRua());
				listaStr.add(cliente.getEndereco().getCidade());
				listaStr.add(cliente.getEndereco().getEstado());
				// lista com valores das tags a serem gravados no xml
				listaValores.add(listaStr);
			}

			// nomes das tags a serem gravadas
			List<String> listaTags = Arrays.asList("id", "nome", "rua", "cidade", "estado");

			try {
				GravadorXml xml = new GravadorXml();
				xml.processar(arquivo, "clientes", "cliente", listaTags, listaValores);
				sucesso.setContentText("Todos os clientes exportados para o arquivo XML");
				sucesso.showAndWait();

			} catch (ParserConfigurationException | FileNotFoundException | TransformerException e) {
				e.printStackTrace();
				erro.setHeaderText("Erro durante exportação de clientes para arquivo XML");
				erro.setContentText(e.getMessage());
				erro.showAndWait();
			}
		}
	}

}