package com.softgraf.vendas.control;

import java.io.IOException;
import java.net.URL;

import com.softgraf.vendas.model.dao.ClienteDAO;
import com.softgraf.vendas.model.dao.Conexao;
import com.softgraf.vendas.model.dao.EnderecoDAO;
import com.softgraf.vendas.model.dao.ItemDAO;
import com.softgraf.vendas.model.dao.PedidoDAO;
import com.softgraf.vendas.model.dao.ProdutoDAO;
import com.softgraf.vendas.view.BackupView;
import com.softgraf.vendas.view.GraficosView;
import com.softgraf.vendas.view.XmlView;

import javafx.application.Application;
import javafx.fxml.FXMLLoader;
import javafx.scene.Parent;
import javafx.scene.Scene;
import javafx.scene.control.Menu;
import javafx.scene.control.MenuBar;
import javafx.scene.control.MenuItem;
import javafx.scene.control.Tab;
import javafx.scene.control.TabPane;
import javafx.scene.image.Image;
import javafx.scene.image.ImageView;
import javafx.scene.layout.BorderPane;
import javafx.scene.layout.VBox;
import javafx.stage.Stage;
import javafx.stage.StageStyle;

public class VendasPrincipal extends Application {

	private static Conexao conexao;
	private static EnderecoDAO enderecoDAO;
	private static ProdutoDAO produtoDAO;
	private static ClienteDAO clienteDAO;
	private static PedidoDAO pedidoDAO;
	private static ItemDAO itemDAO;
	private static String pathIcones = "/com/softgraf/vendas/view/icones/";
	private static GraficosView graficos;
	private static XmlView xmlView;
	private static BackupView backupView;
	private Scene cena;

	public static void main(String[] args) {

		conexao = new Conexao("vendas", "root", "softgraf");

		// Instacia DAOs
		enderecoDAO = new EnderecoDAO(conexao);
		produtoDAO = new ProdutoDAO(conexao);
		clienteDAO = new ClienteDAO(conexao, enderecoDAO);
		itemDAO = new ItemDAO(conexao);
		pedidoDAO = new PedidoDAO(conexao, clienteDAO, itemDAO);

		// Cria tabelas se não existirem
		enderecoDAO.criarTabela();
		clienteDAO.criarTabela();
		produtoDAO.criarTabela();
		pedidoDAO.criarTabela();
		itemDAO.criarTabela();

		graficos = new GraficosView(conexao);

		launch(args);

		conexao.fecharConexao();
	}

	@Override
	public void start(Stage palco) throws Exception {

		if (true) {// (fazerLogin()) {

			xmlView = new XmlView(palco);
			backupView = new BackupView();

			MenuItem itemCidade = new MenuItem("Clientes por Cidade");
			itemCidade.setOnAction(e -> graficos.clientesPorCidade());

			MenuItem itemEstado = new MenuItem("Clientes por Estado");
			itemEstado.setOnAction(e -> graficos.clientesPorEstado());

			Menu menuGraficos = new Menu("Gráficos");
			menuGraficos.getItems().addAll(itemCidade, itemEstado);

			MenuItem itemXmlProduto = new MenuItem("Produtos");
			itemXmlProduto.setOnAction(e -> xmlView.exportarProdutos(produtoDAO));

			MenuItem itemXmlCliente = new MenuItem("Clientes");
			itemXmlCliente.setOnAction(e -> xmlView.exportarClientes(clienteDAO));

			Menu menuXml = new Menu("Exportar XML");
			menuXml.getItems().addAll(itemXmlProduto, itemXmlCliente);

			MenuItem itemBackup = new MenuItem("Backup por FTP");
			itemBackup.setOnAction(e -> backupView.mostrar());

			Menu menuBackup = new Menu("Backup");
			menuBackup.getItems().add(itemBackup);

			MenuItem itemDark = new MenuItem("Darkskin");
			itemDark.setOnAction(e -> trocarEstiloCSS("Darkskin"));
			
			MenuItem itemPink = new MenuItem("Pinkskin");
			itemPink.setOnAction(e -> trocarEstiloCSS("Pinkskin"));

			MenuItem itemPadrao = new MenuItem("Padrão");
			itemPadrao.setOnAction(e -> trocarEstiloCSS("Padrao"));

			Menu menuCSS = new Menu("CSS");
			menuCSS.getItems().add(itemDark);
			menuCSS.getItems().add(itemPink);
			menuCSS.getItems().add(itemPadrao);

			MenuBar menuBar = new MenuBar();
			menuBar.getMenus().addAll(menuGraficos, menuXml, menuBackup, menuCSS);

			Parent painelEndereco = carregaFxml("TelaEndereco");
			Parent painelCliente = carregaFxml("TelaCliente");
			Parent painelProduto = carregaFxml("TelaProduto");
			Parent painelPedido = carregaFxml("TelaPedido");

			Tab abaEndereco = new Tab("Endereco");
			abaEndereco.setClosable(false);
			abaEndereco.setContent(new BorderPane(painelEndereco));
			abaEndereco.setGraphic(novoIcone("endereco.png"));

			Tab abaCliente = new Tab("Cliente");
			abaCliente.setClosable(false);
			abaCliente.setContent(new BorderPane(painelCliente));
			abaCliente.setOnSelectionChanged(e -> ControleCliente.atualizarEnderecos());
			abaCliente.setGraphic(novoIcone("cliente.png"));

			Tab abaProduto = new Tab("Produto");
			abaProduto.setClosable(false);
			abaProduto.setContent(new BorderPane(painelProduto));
			abaProduto.setGraphic(novoIcone("produto.png"));

			Tab abaPedido = new Tab("Pedido");
			abaPedido.setClosable(false);
			abaPedido.setContent(new BorderPane(painelPedido));
			abaPedido.setOnSelectionChanged(e -> ControlePedido.atualizarClientesProdutos());
			abaPedido.setGraphic(novoIcone("pedido.png"));

			TabPane abas = new TabPane(abaEndereco, abaCliente, abaProduto, abaPedido);

			VBox vbox = new VBox(menuBar, abas);
			cena = new Scene(vbox, 800, 500);

			palco.setTitle("Controle de Vendas");
			palco.setScene(cena);
			palco.show();

		}
	}

	private void trocarEstiloCSS(String estilo) {
		cena.getStylesheets().clear();
		if (!estilo.equalsIgnoreCase("padrao")) {
			String css = getClass().getResource("/com/softgraf/vendas/view/css/" + estilo + ".css").toExternalForm();
			cena.getStylesheets().add(css);
		}
	}

	private Parent carregaFxml(String arquivoFxml) throws IOException {
		arquivoFxml = "/com/softgraf/vendas/view/" + arquivoFxml + ".fxml";
		URL url = this.getClass().getResource(arquivoFxml);
		return (Parent) FXMLLoader.load(url);
	}

	private ImageView novoIcone(String imagem) {
		ImageView imageView = new ImageView();
		imageView.setFitHeight(24);
		imageView.setFitWidth(24);
		imageView.setImage(new Image(pathIcones + imagem));
		return imageView;
	}

	private boolean fazerLogin() {
		try {
			Parent painelLogin = carregaFxml("TelaLogin");
			Scene cena = new Scene(painelLogin);
			Stage stage = new Stage();
			stage.setTitle("Login do Sistema");
			stage.setScene(cena);
			stage.setResizable(false);
			stage.showAndWait();

		} catch (IOException e) {
			e.printStackTrace();
		}

		return ControleLogin.isLogado();
	}

	public static Conexao getConexao() {
		return conexao;
	}

	public static EnderecoDAO getEnderecoDAO() {
		return enderecoDAO;
	}

	public static ProdutoDAO getProdutoDAO() {
		return produtoDAO;
	}

	public static ClienteDAO getClienteDAO() {
		return clienteDAO;
	}

	public static PedidoDAO getPedidoDAO() {
		return pedidoDAO;
	}

}