package xyz.danielcortes.controllers.editorial;

import java.util.List;
import javax.swing.JComboBox;
import javax.swing.JOptionPane;
import xyz.danielcortes.models.Editorial;
import xyz.danielcortes.repository.EditorialRepository;
import xyz.danielcortes.views.editorial.EditorialUpdatePanel;

public class EditorialUpdateController {

  private EditorialUpdatePanel view;
  private EditorialRepository editorialRepository;

  public EditorialUpdateController(EditorialUpdatePanel view) {
    this.view = view;
    this.editorialRepository = new EditorialRepository();
    this.setupListeners();
  }

  private void setupListeners() {
    this.view.getEditorialCombo().addActionListener(e -> {
      Editorial selected = (Editorial) this.view.getEditorialCombo().getSelectedItem();
      if (selected != null)
        this.view.getNombreField().setText(selected.getNombre());
    });
    this.view.getNombreField().addActionListener(e -> this.update());
    this.view.getActualizarButton().addActionListener(e -> this.update());
  }

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

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

    assert original != null;
    original.setNombre(nombre);
    this.editorialRepository.update(original);

    this.view.getNombreField().setText("");
    this.loadEditorialCombo();
    this.view.getNombreField().requestFocus();
  }

  private boolean validateOriginal(Editorial original) {
    if (original == null) {
      JOptionPane.showMessageDialog(
          null,
          "No hay Editorial seleccionada",
          "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;
  }

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

  private void loadEditorialCombo() {
    List<Editorial> editoriales = this.editorialRepository.getAll();
    JComboBox<Editorial> combobox = this.view.getEditorialCombo();
    combobox.removeAllItems();
    for(Editorial editorial: editoriales) {
      combobox.addItem(editorial);
    }
  }

  public EditorialUpdatePanel getView() {
    return view;
  }
}
