package capitulo09.bloque01.vista;

import capitulo09.bloque01.controlador.ControladorCliente;
import capitulo09.bloque01.modelo.Cliente;

import java.awt.EventQueue;

import javax.swing.*;
import javax.swing.border.EmptyBorder;
import java.awt.BorderLayout;
import java.awt.Component;
import java.awt.Font;
import java.awt.GridBagLayout;
import java.awt.GridBagConstraints;
import java.awt.Insets;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;

public class GestionCliente extends JFrame {

    Cliente clienteActual;

    private static final long serialVersionUID = 1L;
    private JPanel contentPane;
    private JTextField jtfNombre;
    private JTextField jtfApellidos;
    private JTextField jtfLocalidad;
    private JTextField jtfDniNie;
    private JTextField jtfFechaNac;
    private JTextField jtfId;
    private JCheckBox checkBoxEstado;

    private JButton btnPrimero;
    private JButton btnAnterior;
    private JButton btnSiguiente;
    private JButton btnUltimo;

    /**
     * Launch the application.
     */
    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {
            public void run() {
                try {
                    GestionCliente frame = new GestionCliente();
                    frame.actualizarDatosEnPantalla(ControladorCliente.getPrimerCliente());
                    frame.setVisible(true);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        });
    }


    private void actualizarDatosEnPantalla(Cliente cliente) {
        SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy");

        jtfId.setText("" + cliente.getId());
        jtfNombre.setText(cliente.getNombre());
        jtfApellidos.setText(cliente.getApellidos());
        jtfLocalidad.setText(cliente.getLocalidad());
        jtfDniNie.setText(cliente.getDniNie());
        jtfFechaNac.setText(sdf.format(cliente.getFechaNac()));
        checkBoxEstado.setSelected(cliente.isActivo());
        clienteActual = cliente;

        if (cliente.getId() == ControladorCliente.getPrimerCliente().getId()) {
            btnPrimero.setEnabled(false);
            btnAnterior.setEnabled(false);
            btnSiguiente.setEnabled(true);
            btnUltimo.setEnabled(true);
        } else if (cliente.getId() == ControladorCliente.getUltimoCliente().getId()) {
            btnPrimero.setEnabled(true);
            btnAnterior.setEnabled(true);
            btnSiguiente.setEnabled(false);
            btnUltimo.setEnabled(false);
        } else {
            btnPrimero.setEnabled(true);
            btnAnterior.setEnabled(true);
            btnSiguiente.setEnabled(true);
            btnUltimo.setEnabled(true);
        }
    }

    /**
     * Create the frame.
     */
    public GestionCliente() {
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setBounds(100, 100, 500, 350);
        contentPane = new JPanel();
        contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));

        setContentPane(contentPane);
        contentPane.setLayout(new BorderLayout(0, 0));

        JPanel panel_1 = new JPanel();
        contentPane.add(panel_1, BorderLayout.NORTH);
        panel_1.setLayout(new BoxLayout(panel_1, BoxLayout.Y_AXIS));

        JLabel lblTitulo = new JLabel("Gestión de Clientes");
        lblTitulo.setFont(new Font("Verdana", Font.BOLD, 18));
        lblTitulo.setAlignmentX(Component.CENTER_ALIGNMENT);
        panel_1.add(lblTitulo);

        JPanel panel = new JPanel();
        panel_1.add(panel);
        panel.setLayout(new BoxLayout(panel, BoxLayout.X_AXIS));

        btnPrimero = new JButton("Primero");
        btnPrimero.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                actualizarDatosEnPantalla(ControladorCliente.getPrimerCliente());
            }
        });
        btnPrimero.setToolTipText("Muestra en pantalla el primer cliente de la base de datos");
        panel.add(btnPrimero);

        btnAnterior = new JButton("Anterior");
        btnAnterior.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                actualizarDatosEnPantalla(ControladorCliente.getCliente((clienteActual.getId() - 1)));
            }
        });
        btnAnterior.setToolTipText("Muestra en pantalla el cliente anterior al actual");
        panel.add(btnAnterior);

        btnSiguiente = new JButton("Siguiente");
        btnSiguiente.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                actualizarDatosEnPantalla(ControladorCliente.getCliente((clienteActual.getId() + 1)));
            }
        });
        btnSiguiente.setToolTipText("Muestra en pantalla el cliente siguiente al actual");
        panel.add(btnSiguiente);

        btnUltimo = new JButton("Último");
        btnUltimo.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                actualizarDatosEnPantalla(ControladorCliente.getUltimoCliente());
            }
        });
        btnUltimo.setToolTipText("Muestra en pantalla el ultimo cliente de la base de datos");
        panel.add(btnUltimo);

        JSeparator separator = new JSeparator();
        panel_1.add(separator);

        JPanel panel_2 = new JPanel();
        contentPane.add(panel_2, BorderLayout.CENTER);
        GridBagLayout gbl_panel_2 = new GridBagLayout();
        gbl_panel_2.columnWidths = new int[]{0, 0, 0, 0};
        gbl_panel_2.rowHeights = new int[]{0, 0, 0, 0, 0, 0, 0};
        gbl_panel_2.columnWeights = new double[]{0.8, 0.5, 1.0, 0.8};
        gbl_panel_2.rowWeights = new double[]{0.0, 0.0, 0.0, 0.0, 0.0, 0.0};
        panel_2.setLayout(gbl_panel_2);

        JLabel lblNewLabel = new JLabel("Id");
        GridBagConstraints gbc_lblNewLabel = new GridBagConstraints();
        gbc_lblNewLabel.anchor = GridBagConstraints.EAST;
        gbc_lblNewLabel.insets = new Insets(0, 0, 5, 5);
        gbc_lblNewLabel.gridx = 1;
        gbc_lblNewLabel.gridy = 0;
        panel_2.add(lblNewLabel, gbc_lblNewLabel);

        jtfId = new JTextField();
        jtfId.setEditable(false);
        GridBagConstraints gbc_textField = new GridBagConstraints();
        gbc_textField.insets = new Insets(0, 0, 5, 5);
        gbc_textField.fill = GridBagConstraints.HORIZONTAL;
        gbc_textField.gridx = 2;
        gbc_textField.gridy = 0;
        panel_2.add(jtfId, gbc_textField);
        jtfId.setColumns(10);

        JLabel lblNewLabel_1 = new JLabel("Nombre");
        lblNewLabel_1.setHorizontalAlignment(SwingConstants.RIGHT);
        GridBagConstraints gbc_lblNewLabel_1 = new GridBagConstraints();
        gbc_lblNewLabel_1.anchor = GridBagConstraints.EAST;
        gbc_lblNewLabel_1.insets = new Insets(0, 0, 5, 5);
        gbc_lblNewLabel_1.gridx = 1;
        gbc_lblNewLabel_1.gridy = 1;
        panel_2.add(lblNewLabel_1, gbc_lblNewLabel_1);

        jtfNombre = new JTextField();
        GridBagConstraints gbc_textField_1 = new GridBagConstraints();
        gbc_textField_1.insets = new Insets(0, 0, 5, 5);
        gbc_textField_1.fill = GridBagConstraints.HORIZONTAL;
        gbc_textField_1.gridx = 2;
        gbc_textField_1.gridy = 1;
        panel_2.add(jtfNombre, gbc_textField_1);
        jtfNombre.setColumns(10);

        JLabel lblNewLabel_2 = new JLabel("Apellidos");
        GridBagConstraints gbc_lblNewLabel_2 = new GridBagConstraints();
        gbc_lblNewLabel_2.anchor = GridBagConstraints.EAST;
        gbc_lblNewLabel_2.insets = new Insets(0, 0, 5, 5);
        gbc_lblNewLabel_2.gridx = 1;
        gbc_lblNewLabel_2.gridy = 2;
        panel_2.add(lblNewLabel_2, gbc_lblNewLabel_2);

        jtfApellidos = new JTextField();
        GridBagConstraints gbc_textField_2 = new GridBagConstraints();
        gbc_textField_2.insets = new Insets(0, 0, 5, 5);
        gbc_textField_2.fill = GridBagConstraints.HORIZONTAL;
        gbc_textField_2.gridx = 2;
        gbc_textField_2.gridy = 2;
        panel_2.add(jtfApellidos, gbc_textField_2);
        jtfApellidos.setColumns(10);

        JLabel lblNewLabel_3 = new JLabel("Localidad");
        GridBagConstraints gbc_lblNewLabel_3 = new GridBagConstraints();
        gbc_lblNewLabel_3.anchor = GridBagConstraints.EAST;
        gbc_lblNewLabel_3.insets = new Insets(0, 0, 5, 5);
        gbc_lblNewLabel_3.gridx = 1;
        gbc_lblNewLabel_3.gridy = 3;
        panel_2.add(lblNewLabel_3, gbc_lblNewLabel_3);

        jtfLocalidad = new JTextField();
        GridBagConstraints gbc_textField_3 = new GridBagConstraints();
        gbc_textField_3.insets = new Insets(0, 0, 5, 5);
        gbc_textField_3.fill = GridBagConstraints.HORIZONTAL;
        gbc_textField_3.gridx = 2;
        gbc_textField_3.gridy = 3;
        panel_2.add(jtfLocalidad, gbc_textField_3);
        jtfLocalidad.setColumns(10);

        JLabel lblNewLabel_4 = new JLabel("DNI/NIE");
        GridBagConstraints gbc_lblNewLabel_4 = new GridBagConstraints();
        gbc_lblNewLabel_4.anchor = GridBagConstraints.EAST;
        gbc_lblNewLabel_4.insets = new Insets(0, 0, 5, 5);
        gbc_lblNewLabel_4.gridx = 1;
        gbc_lblNewLabel_4.gridy = 4;
        panel_2.add(lblNewLabel_4, gbc_lblNewLabel_4);

        jtfDniNie = new JTextField();
        GridBagConstraints gbc_textField_4 = new GridBagConstraints();
        gbc_textField_4.insets = new Insets(0, 0, 5, 5);
        gbc_textField_4.fill = GridBagConstraints.HORIZONTAL;
        gbc_textField_4.gridx = 2;
        gbc_textField_4.gridy = 4;
        panel_2.add(jtfDniNie, gbc_textField_4);
        jtfDniNie.setColumns(10);

        JLabel lblNewLabel_5 = new JLabel("Fecha de Nacimiento");
        GridBagConstraints gbc_lblNewLabel_5 = new GridBagConstraints();
        gbc_lblNewLabel_5.anchor = GridBagConstraints.EAST;
        gbc_lblNewLabel_5.insets = new Insets(0, 0, 5, 5);
        gbc_lblNewLabel_5.gridx = 1;
        gbc_lblNewLabel_5.gridy = 5;
        panel_2.add(lblNewLabel_5, gbc_lblNewLabel_5);

        jtfFechaNac = new JTextField();
        GridBagConstraints gbc_textField_5 = new GridBagConstraints();
        gbc_textField_5.insets = new Insets(0, 0, 5, 5);
        gbc_textField_5.fill = GridBagConstraints.HORIZONTAL;
        gbc_textField_5.gridx = 2;
        gbc_textField_5.gridy = 5;
        panel_2.add(jtfFechaNac, gbc_textField_5);
        jtfFechaNac.setColumns(10);

        JLabel lblNewLabel_6 = new JLabel("Estado");
        GridBagConstraints gbc_lblNewLabel_6 = new GridBagConstraints();
        gbc_lblNewLabel_6.anchor = GridBagConstraints.EAST;
        gbc_lblNewLabel_6.insets = new Insets(0, 0, 0, 5);
        gbc_lblNewLabel_6.gridx = 1;
        gbc_lblNewLabel_6.gridy = 6;
        panel_2.add(lblNewLabel_6, gbc_lblNewLabel_6);

        checkBoxEstado = new JCheckBox("");
        GridBagConstraints gbc_chckbxNewCheckBox = new GridBagConstraints();
        gbc_chckbxNewCheckBox.anchor = GridBagConstraints.WEST;
        gbc_chckbxNewCheckBox.insets = new Insets(0, 0, 0, 5);
        gbc_chckbxNewCheckBox.gridx = 2;
        gbc_chckbxNewCheckBox.gridy = 6;
        panel_2.add(checkBoxEstado, gbc_chckbxNewCheckBox);

        JPanel panel_3 = new JPanel();
        contentPane.add(panel_3, BorderLayout.SOUTH);
        panel_3.setLayout(new BoxLayout(panel_3, BoxLayout.Y_AXIS));

        JSeparator separator_1 = new JSeparator();
        panel_3.add(separator_1);

        JPanel panel_4 = new JPanel();
        panel_3.add(panel_4);
        panel_4.setLayout(new BoxLayout(panel_4, BoxLayout.X_AXIS));

        JButton btnNewButton = new JButton("Nuevo");
        btnNewButton.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                Cliente clienteVacio = new Cliente(ControladorCliente.getUltimoCliente().getId() + 1,
                        "",
                        "",
                        "",
                        "",
                        new Date(),
                        true);
                actualizarDatosEnPantalla(clienteVacio);
            }
        });
        btnNewButton.setToolTipText("Limpia la pantalla para crear un nuevo cliente");
        panel_4.add(btnNewButton);
        btnNewButton.setAlignmentX(Component.CENTER_ALIGNMENT);

        JButton btnNewButton_1 = new JButton("Guardar");
        btnNewButton_1.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy");
                Date fecha = null;
                try {
                    fecha = sdf.parse(jtfFechaNac.getText());
                } catch (ParseException ex) {
                    JOptionPane.showMessageDialog(null, "La fecha introducida no es correcta");
                    //throw new RuntimeException(ex);
                }

                Cliente updateClient = new Cliente(clienteActual.getId(),
                        jtfNombre.getText(),
                        jtfApellidos.getText(),
                        jtfLocalidad.getText(),
                        jtfDniNie.getText(),
                        fecha,
                        checkBoxEstado.isSelected());

                if (clienteActual.getId() > ControladorCliente.getUltimoCliente().getId()) {
                    if (ControladorCliente.nuevoCliente(updateClient) > 0) {
                        JOptionPane.showMessageDialog(null, "El cliente se ha añadido correctamente");
                    } else {
                        JOptionPane.showMessageDialog(null, "El cliente no se ha podido añadir");
                    }
                } else {
                    if (ControladorCliente.actualizarCliente(updateClient) > 0) {
                        JOptionPane.showMessageDialog(null, "El cliente se ha actualizado correctamente");
                    } else {
                        JOptionPane.showMessageDialog(null, "El cliente no se ha podido actualizar");
                    }
                }
                actualizarDatosEnPantalla(ControladorCliente.getCliente(clienteActual.getId()));
            }
        });
        btnNewButton_1.setToolTipText("Guarda los cambios realizados en el registro que se ve en pantalla");
        panel_4.add(btnNewButton_1);
        btnNewButton_1.setAlignmentX(Component.CENTER_ALIGNMENT);

        JButton btnNewButton_2 = new JButton("Eliminar");
        btnNewButton_2.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {

                int respuesta = JOptionPane.showConfirmDialog(null, "¿Seguro que desea eliminar el cliente?", "Confirmación", JOptionPane.YES_NO_OPTION);
                if (respuesta == JOptionPane.YES_OPTION) {

                    Cliente clienteAnterior = ControladorCliente.getCliente(clienteActual.getId() - 1);
                    Cliente clienteSiguiente = ControladorCliente.getCliente(clienteActual.getId() + 1);

                    if (ControladorCliente.eliminarCliente(clienteActual.getId()) > 0) {
                        JOptionPane.showMessageDialog(null, "El cliente se ha eliminado correctamente");
                        if (clienteAnterior != null) {
                            actualizarDatosEnPantalla(clienteAnterior);
                        } else if (clienteSiguiente != null) {
                            actualizarDatosEnPantalla(clienteSiguiente);
                        } else {
                            btnNewButton.doClick();
                        }
                    } else {
                        JOptionPane.showMessageDialog(null, "El cliente no se ha podido eliminar");
                    }

                }
            }
        });
        btnNewButton_2.setToolTipText("Elimina el registro que se ve en pantalla");
        panel_4.add(btnNewButton_2);
        btnNewButton_2.setAlignmentX(Component.CENTER_ALIGNMENT);
    }

}
