// Pacote View
package server.view;

// Importação dos pacotes e bibliotecas necessárias
import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;
import javax.swing.JFileChooser;
import javax.swing.JOptionPane;
import server.controle.Controle;
import server.modelo.Autenticacao;
import server.modelo.Pizza;

/*
 Descrição: Tela Adicionar Pizzas
 */
public class TelaAdicionarPizzas extends javax.swing.JFrame {

    // Atributos encapsulados
    private TelaCRUDPizzas telaCRUDPizzas;
    private Autenticacao autenticacao;
    private Controle controle;
    private InputStream streamImagem;

    /*
     Descrição: Construtor padrão da janela de CRUD Pizzas
     Parâmetros:
     Retorno:
     */
    private TelaAdicionarPizzas() {
        initComponents();
    }

    /*
     Descrição: Construtor completo da janela de CRUD Pizzas
     Parâmetros:
     telaCRUDPizzas (Referência à Tela CRUD Pizzas)
     autenticacao (Objeto do tipo Autenticacao contendo informações para acesso ao banco de dados)
     controle (Objeto do tipo Controle)
     Retorno:
     */
    public TelaAdicionarPizzas(TelaCRUDPizzas telaCRUDPizzas, Autenticacao autenticacao, Controle controle) {
        this();
        this.setAutenticacao(autenticacao);
        this.setTelaCRUDPizzas(telaCRUDPizzas);
        this.setControle(controle);
    }

    /**
     * This method is called from within the constructor to initialize the form.
     * WARNING: Do NOT modify this code. The content of this method is always
     * regenerated by the Form Editor.
     */
    @SuppressWarnings("unchecked")
    // <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
    private void initComponents() {

        painel = new javax.swing.JPanel();
        buttonProcurarArquivo = new javax.swing.JButton();
        labelDescricaoPizza = new javax.swing.JLabel();
        textDescricaoPizza = new javax.swing.JTextField();
        labelTamanhoPizza = new javax.swing.JLabel();
        labelFatiasPizza = new javax.swing.JLabel();
        labelIngredientesPizza = new javax.swing.JLabel();
        textIngredientesPizza = new javax.swing.JTextField();
        labelImagemPizza = new javax.swing.JLabel();
        labelPrecoPizza = new javax.swing.JLabel();
        textPrecoPizza = new javax.swing.JTextField();
        botaoCadastrar = new javax.swing.JButton();
        botaoCancelar = new javax.swing.JButton();
        comboBoxQuantidadeFatiasPizza = new javax.swing.JComboBox();
        comboBoxTamanhoPizzas = new javax.swing.JComboBox();

        setDefaultCloseOperation(javax.swing.WindowConstants.DISPOSE_ON_CLOSE);
        setTitle("OpenPizza - Nova Pizza");
        setMaximumSize(new java.awt.Dimension(300, 350));
        setMinimumSize(new java.awt.Dimension(300, 350));
        setPreferredSize(new java.awt.Dimension(300, 350));
        setResizable(false);

        painel.setMaximumSize(new java.awt.Dimension(300, 350));
        painel.setMinimumSize(new java.awt.Dimension(300, 350));
        painel.setPreferredSize(new java.awt.Dimension(300, 350));

        buttonProcurarArquivo.setFont(new java.awt.Font("Cantarell", 0, 16)); // NOI18N
        buttonProcurarArquivo.setText("Selecione...");
        buttonProcurarArquivo.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                buttonProcurarArquivoActionPerformed(evt);
            }
        });

        labelDescricaoPizza.setFont(new java.awt.Font("Tahoma", 0, 16)); // NOI18N
        labelDescricaoPizza.setText("Descrição:");

        textDescricaoPizza.setFont(new java.awt.Font("Cantarell", 0, 16)); // NOI18N

        labelTamanhoPizza.setFont(new java.awt.Font("Tahoma", 0, 16)); // NOI18N
        labelTamanhoPizza.setText("Tamanho:");

        labelFatiasPizza.setFont(new java.awt.Font("Tahoma", 0, 16)); // NOI18N
        labelFatiasPizza.setText("Fatias: ");

        labelIngredientesPizza.setFont(new java.awt.Font("Tahoma", 0, 16)); // NOI18N
        labelIngredientesPizza.setText("Ingredientes:");

        textIngredientesPizza.setFont(new java.awt.Font("Cantarell", 0, 16)); // NOI18N

        labelImagemPizza.setFont(new java.awt.Font("Tahoma", 0, 16)); // NOI18N
        labelImagemPizza.setText("Imagem:");

        labelPrecoPizza.setFont(new java.awt.Font("Tahoma", 0, 16)); // NOI18N
        labelPrecoPizza.setText("Preço:");

        textPrecoPizza.setFont(new java.awt.Font("Cantarell", 0, 16)); // NOI18N

        botaoCadastrar.setFont(new java.awt.Font("Tahoma", 0, 16)); // NOI18N
        botaoCadastrar.setText("Cadastrar");
        botaoCadastrar.setMaximumSize(new java.awt.Dimension(120, 40));
        botaoCadastrar.setMinimumSize(new java.awt.Dimension(120, 40));
        botaoCadastrar.setPreferredSize(new java.awt.Dimension(120, 40));
        botaoCadastrar.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                botaoCadastrarActionPerformed(evt);
            }
        });

        botaoCancelar.setFont(new java.awt.Font("Tahoma", 0, 16)); // NOI18N
        botaoCancelar.setText("Cancelar");
        botaoCancelar.setMaximumSize(new java.awt.Dimension(120, 40));
        botaoCancelar.setMinimumSize(new java.awt.Dimension(120, 40));
        botaoCancelar.setPreferredSize(new java.awt.Dimension(120, 40));
        botaoCancelar.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                botaoCancelarActionPerformed(evt);
            }
        });

        comboBoxQuantidadeFatiasPizza.setFont(new java.awt.Font("Cantarell", 0, 16)); // NOI18N
        comboBoxQuantidadeFatiasPizza.setModel(new javax.swing.DefaultComboBoxModel(new String[] { "4", "6", "8", "10" }));

        comboBoxTamanhoPizzas.setFont(new java.awt.Font("Cantarell", 0, 16)); // NOI18N
        comboBoxTamanhoPizzas.setModel(new javax.swing.DefaultComboBoxModel(new String[] { "Selecione...", "Mini", "Pequena", "Média", "Grande" }));

        javax.swing.GroupLayout painelLayout = new javax.swing.GroupLayout(painel);
        painel.setLayout(painelLayout);
        painelLayout.setHorizontalGroup(
            painelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(painelLayout.createSequentialGroup()
                .addContainerGap()
                .addGroup(painelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addGroup(painelLayout.createSequentialGroup()
                        .addGroup(painelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                            .addComponent(labelIngredientesPizza)
                            .addGroup(painelLayout.createSequentialGroup()
                                .addComponent(labelImagemPizza)
                                .addGap(18, 18, 18)
                                .addComponent(buttonProcurarArquivo, javax.swing.GroupLayout.PREFERRED_SIZE, 118, javax.swing.GroupLayout.PREFERRED_SIZE)))
                        .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
                    .addGroup(painelLayout.createSequentialGroup()
                        .addComponent(labelPrecoPizza)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addComponent(textPrecoPizza, javax.swing.GroupLayout.PREFERRED_SIZE, 70, javax.swing.GroupLayout.PREFERRED_SIZE)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addComponent(labelFatiasPizza)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                        .addComponent(comboBoxQuantidadeFatiasPizza, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                        .addContainerGap(18, Short.MAX_VALUE))
                    .addGroup(painelLayout.createSequentialGroup()
                        .addGroup(painelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING, false)
                            .addGroup(painelLayout.createSequentialGroup()
                                .addComponent(botaoCancelar, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                                .addComponent(botaoCadastrar, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
                            .addGroup(painelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                                .addGroup(painelLayout.createSequentialGroup()
                                    .addComponent(labelDescricaoPizza)
                                    .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                                    .addComponent(textDescricaoPizza, javax.swing.GroupLayout.PREFERRED_SIZE, 180, javax.swing.GroupLayout.PREFERRED_SIZE))
                                .addComponent(textIngredientesPizza, javax.swing.GroupLayout.PREFERRED_SIZE, 275, javax.swing.GroupLayout.PREFERRED_SIZE)
                                .addGroup(painelLayout.createSequentialGroup()
                                    .addComponent(labelTamanhoPizza)
                                    .addGap(18, 18, 18)
                                    .addComponent(comboBoxTamanhoPizzas, javax.swing.GroupLayout.PREFERRED_SIZE, 125, javax.swing.GroupLayout.PREFERRED_SIZE))))
                        .addGap(0, 0, Short.MAX_VALUE))))
        );
        painelLayout.setVerticalGroup(
            painelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, painelLayout.createSequentialGroup()
                .addContainerGap()
                .addGroup(painelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(labelDescricaoPizza)
                    .addComponent(textDescricaoPizza, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
                .addGroup(painelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addGroup(painelLayout.createSequentialGroup()
                        .addGap(16, 16, 16)
                        .addGroup(painelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                            .addComponent(labelFatiasPizza)
                            .addComponent(textPrecoPizza, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)))
                    .addGroup(painelLayout.createSequentialGroup()
                        .addGap(18, 18, 18)
                        .addComponent(labelPrecoPizza))
                    .addGroup(painelLayout.createSequentialGroup()
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                        .addComponent(comboBoxQuantidadeFatiasPizza, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)))
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                .addGroup(painelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(comboBoxTamanhoPizzas, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(labelTamanhoPizza))
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                .addComponent(labelIngredientesPizza)
                .addGap(1, 1, 1)
                .addComponent(textIngredientesPizza, javax.swing.GroupLayout.PREFERRED_SIZE, 48, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                .addGroup(painelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(labelImagemPizza)
                    .addComponent(buttonProcurarArquivo))
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                .addGroup(painelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(botaoCancelar, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(botaoCadastrar, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
                .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
        );

        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
        getContentPane().setLayout(layout);
        layout.setHorizontalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addComponent(painel, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
        );
        layout.setVerticalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addComponent(painel, javax.swing.GroupLayout.PREFERRED_SIZE, 312, javax.swing.GroupLayout.PREFERRED_SIZE)
        );

        getAccessibleContext().setAccessibleDescription("");

        pack();
        setLocationRelativeTo(null);
    }// </editor-fold>//GEN-END:initComponents

    /*
     Descrição: Método para obter uma imagem do sistema
     Parâmetros:
     Retorno:
     */
    private void buttonProcurarArquivoActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_buttonProcurarArquivoActionPerformed
        try {
            //Criação do FileChooser
            JFileChooser imagemEscolhida = new JFileChooser();
            imagemEscolhida.setDialogTitle("Importar Imagem");
            imagemEscolhida.setFileSelectionMode(JFileChooser.FILES_ONLY);
            if (imagemEscolhida.showOpenDialog(this) == JFileChooser.APPROVE_OPTION) {
               this.setStreamImagem(new FileInputStream(new File(imagemEscolhida.getSelectedFile().getPath())));
            }
        } catch (Exception e) {
            JOptionPane.showMessageDialog(null, "Não foi possivel carregar a imagem.");
        }
    }//GEN-LAST:event_buttonProcurarArquivoActionPerformed

    /*
     Descrição: Evento ao clicar no botão Cadastrar
     Parâmetros:
     Retorno:
     */
    private void botaoCadastrarActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_botaoCadastrarActionPerformed

        // Validação dos campos informados
        boolean verificarCampos = this.getControle().verificarCamposPizza(this.textDescricaoPizza, this.textPrecoPizza, this.comboBoxTamanhoPizzas);

        // Campos válidos -> Tentativa de inserção
        if (verificarCampos) {
            String descricao = this.textDescricaoPizza.getText();
            float preco = Float.parseFloat(this.textPrecoPizza.getText());
            String tamanho = String.valueOf(this.comboBoxTamanhoPizzas.getSelectedIndex());
            int fatias = Integer.parseInt(String.valueOf(this.comboBoxQuantidadeFatiasPizza.getSelectedItem()));
            String ingredientes = this.textIngredientesPizza.getText();
            InputStream imagem = this.getStreamImagem();
            Pizza novaPizza = new Pizza(descricao, preco, tamanho, fatias, ingredientes, imagem);
            boolean inserirProduto = this.getControle().inserirProduto(this.getAutenticacao(), novaPizza);

            // Inserção válida -> Mensagem de aviso
            if (inserirProduto) {
                JOptionPane.showMessageDialog(null, "Produto inserido com sucesso.", "Aviso", JOptionPane.INFORMATION_MESSAGE);
                this.textDescricaoPizza.setText(null);
                this.textPrecoPizza.setText(null);
                this.textIngredientesPizza.setText(null);
                this.comboBoxQuantidadeFatiasPizza.setSelectedIndex(0);
                this.comboBoxTamanhoPizzas.setSelectedIndex(0);

            } // Inserção inválida -> Mensagem de erro
            else {
                JOptionPane.showMessageDialog(null, "Ocorreu um erro ao tentar inserir o produto no banco de dados.", "Erro", JOptionPane.ERROR_MESSAGE);
            }
        } // Campos inválidos -> Mensagem de alerta
        else {
            JOptionPane.showMessageDialog(null, "Por favor, preencha os campos com valores válidos.", "Aviso", JOptionPane.INFORMATION_MESSAGE);
        }
    }//GEN-LAST:event_botaoCadastrarActionPerformed

    /*
     Descrição: Evento ao clicar no botão Cancelar
     Parâmetros:
     Retorno:
     */
    private void botaoCancelarActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_botaoCancelarActionPerformed
        // Fechar a janela atual
        this.dispose();
    }//GEN-LAST:event_botaoCancelarActionPerformed

    /**
     * @param args the command line arguments
     */
    public static void main(String args[]) {
        /* Set the Nimbus look and feel */
        //<editor-fold defaultstate="collapsed" desc=" Look and feel setting code (optional) ">
        /* If Nimbus (introduced in Java SE 6) is not available, stay with the default look and feel.
         * For details see http://download.oracle.com/javase/tutorial/uiswing/lookandfeel/plaf.html 
         */
        try {
            for (javax.swing.UIManager.LookAndFeelInfo info : javax.swing.UIManager.getInstalledLookAndFeels()) {
                if ("Nimbus".equals(info.getName())) {
                    javax.swing.UIManager.setLookAndFeel(info.getClassName());
                    break;
                }
            }
        } catch (ClassNotFoundException ex) {
            java.util.logging.Logger.getLogger(TelaAdicionarPizzas.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        } catch (InstantiationException ex) {
            java.util.logging.Logger.getLogger(TelaAdicionarPizzas.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        } catch (IllegalAccessException ex) {
            java.util.logging.Logger.getLogger(TelaAdicionarPizzas.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        } catch (javax.swing.UnsupportedLookAndFeelException ex) {
            java.util.logging.Logger.getLogger(TelaAdicionarPizzas.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        }
        //</editor-fold>

        /* Create and display the form */
        java.awt.EventQueue.invokeLater(new Runnable() {
            public void run() {
                new TelaAdicionarPizzas().setVisible(true);
            }
        });
    }

    // Variables declaration - do not modify//GEN-BEGIN:variables
    private javax.swing.JButton botaoCadastrar;
    private javax.swing.JButton botaoCancelar;
    private javax.swing.JButton buttonProcurarArquivo;
    private javax.swing.JComboBox comboBoxQuantidadeFatiasPizza;
    private javax.swing.JComboBox comboBoxTamanhoPizzas;
    private javax.swing.JLabel labelDescricaoPizza;
    private javax.swing.JLabel labelFatiasPizza;
    private javax.swing.JLabel labelImagemPizza;
    private javax.swing.JLabel labelIngredientesPizza;
    private javax.swing.JLabel labelPrecoPizza;
    private javax.swing.JLabel labelTamanhoPizza;
    private javax.swing.JPanel painel;
    private javax.swing.JTextField textDescricaoPizza;
    private javax.swing.JTextField textIngredientesPizza;
    private javax.swing.JTextField textPrecoPizza;
    // End of variables declaration//GEN-END:variables

    /*
     Descrição: Método get da telaCRUDPizzas
     Parâmetros:
     Retorno:
     telaCRUDPizzas (Referência à Tela CRUD Pizzas)
     */
    public TelaCRUDPizzas getTelaCRUDPizzas() {
        return telaCRUDPizzas;
    }

    /*
     Descrição: Método set da telaCRUDPizzas
     Parâmetros:
     telaCRUDPizzas (Referência à Tela CRUD Pizzas)
     Retorno:
     */
    public void setTelaCRUDPizzas(TelaCRUDPizzas telaCRUDPizzas) {
        this.telaCRUDPizzas = telaCRUDPizzas;
    }

    /*
     Descrição: Método get da autenticacao
     Parâmetros:
     Retorno:
     autenticacao (Objeto do tipo Autenticacao contendo as inforamações para acesso ao banco de dados)
     */
    public Autenticacao getAutenticacao() {
        return autenticacao;
    }

    /*
     Descrição: Método set da autenticacao
     Parâmetros:
     autenticacao (Objeto do tipo Autenticacao contendo as inforamações para acesso ao banco de dados)
     Retorno:
     */
    public void setAutenticacao(Autenticacao autenticacao) {
        this.autenticacao = autenticacao;
    }

    /*
     Descrição: Método get do controle
     Parâmetros:
     Retorno:
     controle (Objeto do tipo Controle)
     */
    public Controle getControle() {
        return controle;
    }

    /*
     Descrição: Método set do controle
     Parâmetros:
     controle (Objeto do tipo Controle)
     Retorno:
     */
    public void setControle(Controle controle) {
        this.controle = controle;
    }

    public InputStream getStreamImagem() {
        return streamImagem;
    }

    public void setStreamImagem(InputStream streamImagem) {
        this.streamImagem = streamImagem;
    }
}
