package xyz.danielcortes.controllers.autor;

import java.util.List;
import javax.swing.JComboBox;
import javax.swing.JOptionPane;
import xyz.danielcortes.models.Autor;
import xyz.danielcortes.repository.AutorRepository;
import xyz.danielcortes.views.autor.AutorUpdatePanel;

public class AutorUpdateController {

  private AutorUpdatePanel view;
  private AutorRepository autorRepository;

  public AutorUpdateController(AutorUpdatePanel view) {
    this.view = view;
    this.autorRepository = new AutorRepository();
    this.setupListeners();
    this.loadAutorCombo();
  }

  private void setupListeners() {
    this.view.getAutorCombo().addActionListener(e -> {
      Autor selected = (Autor) view.getAutorCombo().getSelectedItem();
      if (selected != null) {
        this.view.getNombreField().setText(selected.getNombre());
        this.view.getApellidoPaternoField().setText(selected.getApellidoPaterno());
        this.view.getApellidoMaternoField().setText(selected.getApellidoMaterno());
      }
    });
    this.view.getApellidoPaternoField().addActionListener(e -> update());
    this.view.getActualizarButton().addActionListener(e -> update());
  }

  private void update() {
    Autor original = (Autor) this.view.getAutorCombo().getSelectedItem();
    if(!validateOriginal(original)) return;

    String nombre = this.view.getNombreField().getText();
    if(!validateNombre(nombre)) return;

    String apellidoPaterno = this.view.getApellidoPaternoField().getText();
    if(!validateApellidoPaterno(apellidoPaterno)) return;

    String apellidoMaterno = this.view.getApellidoMaternoField().getText();
    if(!validateApellidoMaterno(apellidoMaterno)) return;

    assert original != null;
    original.setNombre(nombre);
    original.setApellidoPaterno(apellidoPaterno);
    original.setApellidoMaterno(apellidoMaterno);

    this.autorRepository.update(original);

    this.loadAutorCombo();
    this.view.getNombreField().requestFocus();
  }

  private boolean validateOriginal(Autor original) {
    if (original == null) {
      JOptionPane.showMessageDialog(
          null,
          "No hay Autor seleccionado",
          "Error",
          JOptionPane.ERROR_MESSAGE
      );
      return false;
    }
    return true;
  }

  private boolean validateNombre(String nombre) {
    if (nombre == null) {
      JOptionPane.showMessageDialog(
          this.view.getContentPane(),
          "El nombre es nulo",
          "Error",
          JOptionPane.ERROR_MESSAGE);
      return false;
    } else if (nombre.isEmpty()) {
      JOptionPane.showMessageDialog(this.view.getContentPane(),
          "El nombre esta vacío",
          "Error",
          JOptionPane.ERROR_MESSAGE);
      return false;
    }
    return true;
  }

  private boolean validateApellidoPaterno(String apellidoPaterno) {
    if (apellidoPaterno == null) {
      JOptionPane.showMessageDialog(
          this.view.getContentPane(),
          "El apellido paterno es nulo",
          "Error",
          JOptionPane.ERROR_MESSAGE);
      return false;
    } else if (apellidoPaterno.isEmpty()) {
      JOptionPane.showMessageDialog(this.view.getContentPane(),
          "El apellido paterno esta vacío",
          "Error",
          JOptionPane.ERROR_MESSAGE);
      return false;
    }
    return true;
  }

  private boolean validateApellidoMaterno(String apellidoMaterno) {
    if (apellidoMaterno == null) {
      JOptionPane.showMessageDialog(
          this.view.getContentPane(),
          "El apellido materno es nulo",
          "Error",
          JOptionPane.ERROR_MESSAGE);
      return false;
    } else if (apellidoMaterno.isEmpty()) {
      JOptionPane.showMessageDialog(this.view.getContentPane(),
          "El apellido materno esta vacío",
          "Error",
          JOptionPane.ERROR_MESSAGE);
      return false;
    }
    return true;
  }

  public void reload() {
    this.loadAutorCombo();
  }

  private void loadAutorCombo() {
    List<Autor> autores = this.autorRepository.getAll();
    JComboBox<Autor> combobox = this.view.getAutorCombo();
    combobox.removeAllItems();
    for (Autor autor : autores) {
      combobox.addItem(autor);
    }
  }

  public AutorUpdatePanel getView() {
    return view;
  }
}
