/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package br.com.ctecinf.view;

import br.com.ctecinf.swing.RelatorioPanel;
import br.com.ctecinf.Daruma;
import br.com.ctecinf.Main;
import br.com.ctecinf.model.Cliente;
import br.com.ctecinf.Empresa;
import br.com.ctecinf.model.Fornecedor;
import br.com.ctecinf.model.Grupo;
import br.com.ctecinf.model.Ncm;
import br.com.ctecinf.model.Produto;
import br.com.ctecinf.model.SubGrupo;
import br.com.ctecinf.Database;
import br.com.ctecinf.model.Usuario;
import br.com.ctecinf.nfe.view.MenuNFCe;
import br.com.ctecinf.orm.swing.FormPanelController;
import br.com.ctecinf.orm.swing.TablePanelController;
import br.com.ctecinf.swing.Image;
import br.com.ctecinf.swing.OptionPane;
import br.com.ctecinf.swing.PleaseWaitDialog;
import br.com.ctecinf.swing.TabbedPane;
import java.awt.Desktop;
import java.io.File;
import java.io.IOException;
import java.net.URI;
import java.sql.Date;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.List;
import java.util.Locale;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.filechooser.FileNameExtensionFilter;

/**
 *
 * @author Cássio Conceição
 * @since 29/05/2019
 * @version 201905
 * @see http://ctecinf.com.br/
 */
public class MenuBar extends JMenuBar {

    private final TabbedPane pane;

    public MenuBar(TabbedPane pane) {
        this.pane = pane;
        initUI();
    }

    private void initUI() {

        add(new MenuNFCe(pane));

        JMenu menu = new JMenu("Cadastro");
        menu.setIcon(Image.parse(Image.EDIT, 32));
        for (JMenuItem item : itemsCadastro()) {
            menu.add(item);
        }
        add(menu);

        menu = new JMenu("Relatório");
        menu.setIcon(Image.parse(Image.GRAPHIC));
        for (JMenuItem item : itemsRelatorio()) {
            menu.add(item);
        }
        add(menu);

        menu = new JMenu("Ferramentas");
        menu.setIcon(Image.parse(Image.CONFIGURE, 32));
        for (JMenuItem item : itemsFerramenta()) {
            menu.add(item);
        }
        add(menu);

    }

    private List<JMenuItem> itemsRelatorio() {

        JMenuItem item;
        List<JMenuItem> items = new ArrayList();

        item = new JMenuItem("Clientes no SPC");
        item.addActionListener((e) -> {
            String query = "SELECT nome AS \"Nome\", cpf AS \"CPF\", spc AS \"Data Cadastro SPC\" FROM cliente WHERE spc IS NOT NULL";
            pane.add("Clientes no SPC", new RelatorioPanel(query));

        });
        items.add(item);

        item = new JMenuItem("Crediário Atrasado");
        item.addActionListener((e) -> {

            Calendar dt = Calendar.getInstance(new Locale("pt", "BR"));

            dt.add(Calendar.DATE, -10);
            dt.add(Calendar.YEAR, -5);

            Date ini = new java.sql.Date(dt.getTimeInMillis());

            dt.add(Calendar.YEAR, 5);

            Date end = new java.sql.Date(dt.getTimeInMillis());

            String query = "SELECT c.id AS \"Código\", "
                    + "cli.nome AS \"Cliente\", "
                    + "c.data_venda AS \"Data Venda\", "
                    + "c.valor_total AS \"Total da Venda\", "
                    + "(c.numero_parcelas + 1) AS \"Num. de Parcelas\", "
                    + "COUNT(p.id) AS \"Qtde. Parcelas Atrasadas\", "
                    + "SUM(p.valor) AS \"Total Atrasado\""
                    + "FROM crediario c "
                    + "JOIN cliente cli ON c.cliente_id = cli.id "
                    + "JOIN parcela p ON p.crediario_id = c.id "
                    + "WHERE p.data_vencimento BETWEEN '" + ini + "' AND '" + end + "' "
                    + "AND p.data_pagamento IS NULL "
                    + "GROUP BY c.id, cli.nome, c.data_venda, c.valor_total, c.numero_parcelas "
                    + "ORDER BY c.data_venda DESC";

            pane.add("Clientes Atrasados", new RelatorioPanel(query));

        });
        items.add(item);

        return items;
    }

    private List<JMenuItem> itemsCadastro() {

        JMenuItem item;
        List<JMenuItem> items = new ArrayList();

//        item = new JMenuItem("Pedidos");
//        item.addActionListener((l) -> {
//
//            File file = new File("pedido");
//
//            JList<File> list = new JList<>(new ListModel<File>(file.listFiles()));
//            list.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
//
//            JToolBar bar = new JToolBar();
//            bar.setFloatable(false);
//            bar.setLayout(new FlowLayout(FlowLayout.RIGHT));
//
//            JButton button = new JButton("Visualizar XML", Image.parse(Image.VIEW));
//            button.addActionListener((ActionEvent e) -> {
//                try {
//                    Desktop.getDesktop().open(list.getSelectedValue());
//                } catch (Exception ex) {
//                    OptionPane.error(ex);
//                }
//            });
//            bar.add(button);
//
//            button = new JButton("Imprimir", Image.parse(Image.PRINT));
//            button.addActionListener((ActionEvent e) -> {
//                try {
//
//                } catch (Exception ex) {
//                    OptionPane.error(ex);
//                }
//            });
//            bar.add(button);
//
//            button = new JButton("Cancelar", Image.parse(Image.CANCEL));
//            button.addActionListener((ActionEvent e) -> {
//
//                if (list.getSelectedIndex() > -1 && OptionPane.confirm("Deseja realmente excluír o pedido?")) {
//                    File sel = list.getSelectedValue();
//                    ((ListModel) list.getModel()).remove(sel);
//                    sel.delete();
//                }
//            });
//            bar.add(button);
//
//            JPanel panel = new JPanel(new BorderLayout());
//            panel.add(bar, BorderLayout.NORTH);
//            panel.add(new JScrollPane(list), BorderLayout.CENTER);
//
//            pane.add("Pedidos em aberto", panel);
//
//        });
//        items.add(item);

        item = new JMenuItem("Cliente");
        item.addActionListener((l) -> {

            new PleaseWaitDialog<TablePanelController<Cliente>>() {
                @Override
                public TablePanelController<Cliente> exec() throws Exception {
                    return new TablePanelController<Cliente>() {
                        @Override
                        protected FormPanelController<Cliente> getForm(Cliente controller) {
                            return new ClienteForm(controller);
                        }
                    };
                }

                @Override
                public void end(TablePanelController<Cliente> result) {
                    pane.add("Cadastro de cliente", result);
                    result.getFilter().requestFocus();
                }
            }.start();

        });
        items.add(item);

        item = new JMenuItem("Fornecedor");
        item.addActionListener((l) -> {

            new PleaseWaitDialog<TablePanelController<Fornecedor>>() {
                @Override
                public TablePanelController<Fornecedor> exec() throws Exception {
                    return new TablePanelController<Fornecedor>() {
                        @Override
                        protected FormPanelController<Fornecedor> getForm(Fornecedor controller) {
                            return new FornecedorForm(controller);
                        }
                    };
                }

                @Override
                public void end(TablePanelController<Fornecedor> result) {
                    pane.add("Cadastro de fornecedor", result);
                    result.getFilter().requestFocus();
                }
            }.start();

        });
        items.add(item);

        item = new JMenuItem("NCM");
        item.addActionListener((l) -> {
            pane.add("Cadastro de NCM", new TablePanelController<Ncm>() {
                @Override
                protected FormPanelController<Ncm> getForm(Ncm controller) {
                    return new FormPanelController(controller).getDefaultForm("Cadastro NCM");
                }
            });

        });
        items.add(item);

        item = new JMenuItem("Grupo");
        item.addActionListener((l) -> {
            pane.add("Cadastro de Grupo", new TablePanelController<Grupo>() {
                @Override
                protected FormPanelController<Grupo> getForm(Grupo controller) {
                    return new FormPanelController(controller).getDefaultForm("Cadastro Grupo");
                }
            });

        });
        items.add(item);

        item = new JMenuItem("Sub-Grupo");
        item.addActionListener((l) -> {
            pane.add("Cadastro de Sub-Grupo", new TablePanelController<SubGrupo>() {
                @Override
                protected FormPanelController<SubGrupo> getForm(SubGrupo controller) {
                    return new FormPanelController(controller).getDefaultForm("Cadastro Sub-Grupo");
                }
            });

        });
        items.add(item);

        item = new JMenuItem("Usuário Tablet");
        item.addActionListener((l) -> {
            pane.add("Cadastro de Usuário Tablet", new TablePanelController<Usuario>() {
                @Override
                protected FormPanelController<Usuario> getForm(Usuario controller) {
                    return new FormPanelController(controller).getDefaultForm("Cadastro Usuário");
                }
            });
        });
        items.add(item);

        item = new JMenuItem("Produto");
        item.addActionListener((l) -> {

            new PleaseWaitDialog<TablePanelController<Produto>>() {
                @Override
                public TablePanelController<Produto> exec() throws Exception {
                    return new TablePanelController<Produto>() {

                        @Override
                        protected FormPanelController<Produto> create(Produto produto) {

                            Produto p = new Produto();

                            if (getTable().getSelectedRow() > -1) {
                                Fornecedor f = ((Produto) getTable().getModel().getData().get(getTable().getRowSorter().convertRowIndexToModel(getTable().getSelectedRow()))).getFornecedor();
                                p.setFornecedor(f);
                            }

                            return new ProdutoForm(p);
                        }

                        @Override
                        protected FormPanelController<Produto> getForm(Produto controller) {
                            return new ProdutoForm(controller);
                        }
                    };
                }

                @Override
                public void end(TablePanelController<Produto> result) {
                    pane.add("Cadastro de Produto", result);
                    result.getFilter().requestFocus();
                }
            }.start();
        });
        items.add(item);

        item = new JMenuItem("Estoque");
        item.addActionListener((l) -> {

            new PleaseWaitDialog<EstoquePanel>() {
                @Override
                public EstoquePanel exec() throws Exception {
                    return new EstoquePanel();
                }

                @Override
                public void end(EstoquePanel result) {
                    pane.add("Estoque", result);
                    result.getFilter().requestFocus();
                }
            }.start();
        });
        items.add(item);
        
        item = new JMenuItem("Novo Crediário");
        item.addActionListener((l) -> {
            new PleaseWaitDialog<CrediarioForm>() {
                @Override
                public CrediarioForm exec() throws Exception {
                    return new CrediarioForm(null);
                }

                @Override
                public void end(CrediarioForm result) {
                    result.getFrame().setVisible(true);
                }
            }.start();
        });
        items.add(item);

        item = new JMenuItem("Novo Talão");
        item.addActionListener((l) -> {
            new PleaseWaitDialog<ReceitaForm>() {
                @Override
                public ReceitaForm exec() throws Exception {
                    return new ReceitaForm(null);
                }

                @Override
                public void end(ReceitaForm result) {
                    result.getFrame().setVisible(true);
                }
            }.start();
        });
        items.add(item);

        item = new JMenuItem("Nova Lente");
        item.addActionListener((l) -> {
            new PleaseWaitDialog<LenteForm>() {
                @Override
                public LenteForm exec() throws Exception {
                    return new LenteForm(null);
                }

                @Override
                public void end(LenteForm result) {
                    result.getFrame().setVisible(true);
                }
            }.start();
        });
        items.add(item);

        return items;
    }

    private List<JMenuItem> itemsFerramenta() {

        JMenuItem item;
        List<JMenuItem> items = new ArrayList();

        item = new JMenuItem("Emitir Recibo Avulso");
        item.addActionListener((l) -> {
            try {
                Daruma.recibo();
            } catch (IOException ex) {
                OptionPane.error(ex);
            }
        });
        items.add(item);

        item = new JMenuItem("Consultar SPC");
        item.addActionListener((l) -> {
            try {
                Desktop.getDesktop().browse(URI.create("https://webnet.scpcrs.org.br/Login.aspx"));
            } catch (IOException ex) {
                OptionPane.error(ex);
            }
        });
        items.add(item);

        if (Main.TITLE.contains("PENDRIVE")) {

//            item = new JMenuItem("Transferir dados da PENDRIVE");
//            item.addActionListener((l) -> {
//
//                new PleaseWaitDialog<Boolean>() {
//
//                    @Override
//                    public Boolean exec() throws Exception {
//
//                        Database.exportData("FORNECEDOR");
//                        Database.exportData("GRUPO");
//                        Database.exportData("NCM");
//                        Database.exportData("PRODUTO");
//                        Database.exportData("SUB_GRUPO");
//                        Database.exportData("CLIENTE");
//
//                        return true;
//                    }
//
//                    @Override
//                    public void end(Boolean result) {
//                        if (result) {
//                            OptionPane.success("Transferência concluída.");
//                        }
//                    }
//                }.start();
//            });
//            items.add(item);
        }

        item = new JMenuItem("Backup Banco de Dados");
        item.addActionListener((l) -> {

            File file = OptionPane.chooseFile(new FileNameExtensionFilter("Arquivo SQL", "sql"));

            new PleaseWaitDialog<File>() {

                @Override
                public File exec() throws Exception {
                    Database.restore(file);
                    return file;
                }

                @Override
                public void end(File result) throws Exception {
                    if (OptionPane.confirm("Backup concluído, deseja visualizar arquivo?")) {
                        Desktop.getDesktop().open(result);
                    }
                }
            }.start();
        });
        items.add(item);

        item = new JMenuItem("Simulador de Juros");
        item.addActionListener((l) -> {
            pane.add("Simulador de Juros", new SimuladorJurosPanel());
        });
        items.add(item);

        item = new JMenuItem("Validar XML");
        item.addActionListener((l) -> {
            try {
                Desktop.getDesktop().browse(URI.create("https://www.sefaz.rs.gov.br/nfe/nfe-val.aspx"));
            } catch (IOException ex) {
                OptionPane.error(ex);
            }
        });
        items.add(item);

        item = new JMenuItem("Sistema SEFAZ (e-CAC)");
        item.addActionListener((l) -> {
            try {
                Desktop.getDesktop().browse(URI.create("https://www.sefaz.rs.gov.br/Receita/PortaleCAC.aspx"));
            } catch (IOException ex) {
                OptionPane.error(ex);
            }
        });
        items.add(item);

        item = new JMenuItem("Avisos");
        item.addActionListener((l) -> {
            if (Empresa.getMensagem() != null) {
                OptionPane.info(Empresa.getMensagem());
            } else {
                OptionPane.info("Você não possui nenhum aviso!");
            }
        });
        items.add(item);

        return items;
    }

}
