/*
 * 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.nfe.view;

import br.com.ctecinf.Config;
import br.com.ctecinf.Email;
import br.com.ctecinf.Empresa;
import br.com.ctecinf.nfe.CACerts;
import br.com.ctecinf.nfe.Controller;
import br.com.ctecinf.nfe.PgtoAntecipado;
import br.com.ctecinf.nfe.SEFAZConnection;
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 br.inf.portalfiscal.nfe.v400.status.TRetConsStatServ;
import java.awt.Component;
import java.awt.event.ActionEvent;
import java.io.File;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.List;
import javax.swing.JMenu;
import javax.swing.JMenuItem;
import javax.swing.JSeparator;
import javax.swing.UIManager;
import javax.swing.filechooser.FileNameExtensionFilter;

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

    private final TabbedPane pane;
    private JMenuItem itemProd;
    private JMenuItem itemHomo;

    public MenuNFCe(TabbedPane pane) {
        super("NFC-e");
        this.pane = pane;
        init();
    }

    private void init() {
        setIcon(Image.parse(Image.NFCE, 32));
        itemsNFCe().stream().forEach((item) -> {
            add(item);
        });
    }

    private List<Component> itemsNFCe() {

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

        item = new JMenuItem("Emitir Nova NFC-e");
        item.addActionListener((l) -> {
            new PleaseWaitDialog() {
                @Override
                public Object exec() throws Exception {
                    return new EmissorPanel();
                }

                @Override
                public void end(Object result) {
                    pane.add("NFC-e", (Component) result);
                }
            }.start();
        });
        items.add(item);

        item = new JMenuItem("Sinal Encomenda");
        item.addActionListener((ActionEvent e) -> {
            PgtoAntecipado.show();
        });
        items.add(item);

        item = new JMenuItem("NFC-e Emitidas");
        item.addActionListener((l) -> {
            new PleaseWaitDialog() {
                @Override
                public Object exec() throws Exception {
                    return new EmitidasPanel();
                }

                @Override
                public void end(Object result) {
                    pane.add("NFC-e Emitidas", (Component) result);
                }
            }.start();
        });
        items.add(item);

        item = new JMenuItem("Relatório de Vendas");
        item.addActionListener((l) -> {

            Calendar dt = OptionPane.choiceMonth(5);

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

                @Override
                public void end(VendasPanel result) {
                    SimpleDateFormat df = new SimpleDateFormat("MM/yyyy");
                    pane.add("Vendas " + df.format(dt.getTime()), result);
                }
            }.start();
        });
        items.add(item);

        item = new JMenuItem("Quebra de Sequência");
        item.addActionListener((l) -> {
            new PleaseWaitDialog() {
                @Override
                public Object exec() throws Exception {
                    return new QuebraSequenciaPanel();
                }

                @Override
                public void end(Object result) {
                    pane.add("Quebra de Sequência", (Component) result);
                }
            }.start();
        });
        items.add(item);

        items.add(new JSeparator());

        item = new JMenuItem("Enviar XML's para contador");
        item.addActionListener((l) -> {

            if (Empresa.getContadorEmail() == null || Empresa.getContadorEmail().isEmpty()) {
                OptionPane.error("Email do contador não cadastrado.");
                return;
            }

            final Calendar dt = OptionPane.choiceMonth(5);

            if (dt == null) {
                return;
            }

            new PleaseWaitDialog() {

                @Override
                public Object exec() throws Exception {

                    List<File> files = Controller.getXMLFiles(dt);

                    SimpleDateFormat df = new SimpleDateFormat("MM/yyyy");

                    if (files.isEmpty()) {
                        throw new Exception("Nenhum arquivo XML encontrado no período [" + df.format(dt.getTime()) + "].");
                    } else {
                        Email.send(Empresa.getContadorEmail(), Empresa.getRazaoSocial() + " arquivo(s) XML", "Segue em anexo o(s) arquivo(s) XML's emitido(s) no período [" + df.format(dt.getTime()) + "].", files.toArray(File[]::new));
                        return true;
                    }
                }

                @Override
                public void end(Object result) {
                    if (result != null && (Boolean) result) {
                        OptionPane.success("Arquivos enviados com sucesso para o contador.");
                    }
                }

            }.start();
        });
        items.add(item);

        item = new JMenuItem("Importar XML NFC-e processada");
        item.addActionListener((l) -> {

            final File file = OptionPane.chooseFile("Selecione o arquivo XML processado.", new FileNameExtensionFilter("Arquivo XML", "xml", "XML"));

            if (file != null) {

                new PleaseWaitDialog() {

                    @Override
                    public Object exec() throws Exception {
                        return Controller.importarNFCe(file);
                    }

                    @Override
                    public void end(Object result) {
                        if ((Boolean) result) {
                            OptionPane.success("Arquivo importado com sucesso.");
                        } else {
                            OptionPane.error("Houve algum erro no arquivo de importação.");
                        }
                    }

                }.start();
            }
        });
        items.add(item);

        item = new JMenuItem("Importar XMLs de NFC-e processadas");
        item.addActionListener((l) -> {

            final File file = OptionPane.chooseDirectory("Selecione o diretório dos XMLs processados.");

            if (file != null) {

                new PleaseWaitDialog<Boolean>() {

                    @Override
                    public Boolean exec() throws Exception {

                        for (File file : file.listFiles()) {
                            if (file.getAbsolutePath().endsWith(".xml")) {
                                try {
                                    Controller.importarNFCe(file);
                                } catch (Exception ex) {
                                    OptionPane.alert(ex.getMessage());
                                }
                            }
                        }

                        return true;
                    }

                    @Override
                    public void end(Boolean result) {
                        if (result) {
                            OptionPane.info("Importação concluída.");
                        }
                    }

                }.start();
            }
        });
        items.add(item);

        items.add(new JSeparator());

        item = new JMenuItem("Consultar Status do Serviço");
        item.addActionListener((l) -> {
            new PleaseWaitDialog() {
                @Override
                public Object exec() throws Exception {
                    TRetConsStatServ ret = SEFAZConnection.consultarStatusServico();
                    return ret.getCStat() + ": " + ret.getXMotivo();
                }

                @Override
                public void end(Object result) {
                    OptionPane.info(result);
                }
            }.start();
        });
        items.add(item);

        item = new JMenuItem("Gerar CA Certs");
        item.addActionListener((l) -> {
            try {
                CACerts.generateCACerts();
            } catch (Exception ex) {
                OptionPane.error(ex);
            }
        });
        items.add(item);

        items.add(new JSeparator());

        items.add(menuAmbiente());

        return items;
    }

    private JMenu menuAmbiente() {

        JMenu menu = new JMenu("Ambiente Emissão NFC-e");

        itemProd = new JMenuItem("Produção");
        if (Config.get("nfe.amb").equals("1")) {
            itemProd.setBackground(UIManager.getColor("ComboBox.selectionBackground"));
        }
        itemProd.addActionListener((e) -> {
            itemProd.setBackground(UIManager.getColor("ComboBox.selectionBackground"));
            itemHomo.setBackground(UIManager.getColor("ComboBox.background"));
            Config.set("nfe.amb", "1");
            OptionPane.alert("Ambiente de Produção selecionado!");
        });
        menu.add(itemProd);

        itemHomo = new JMenuItem("Homologação");
        if (Config.get("nfe.amb").equals("2")) {
            itemHomo.setBackground(UIManager.getColor("ComboBox.selectionBackground"));
        }
        itemHomo.addActionListener((e) -> {
            itemHomo.setBackground(UIManager.getColor("ComboBox.selectionBackground"));
            itemProd.setBackground(UIManager.getColor("ComboBox.background"));
            Config.set("nfe.amb", "2");
            OptionPane.alert("Ambiente de Homologação selecionado!");
        });
        menu.add(itemHomo);

        return menu;
    }
}
