package xyz.danielcortes.controllers.libro;

import java.time.Year;
import java.util.HashSet;
import java.util.List;
import javax.swing.DefaultListModel;
import javax.swing.JComboBox;
import xyz.danielcortes.models.Autor;
import xyz.danielcortes.models.Categoria;
import xyz.danielcortes.models.Editorial;
import xyz.danielcortes.models.Idioma;
import xyz.danielcortes.models.Libro;
import xyz.danielcortes.repository.AutorRepository;
import xyz.danielcortes.repository.CategoriaRepository;
import xyz.danielcortes.repository.EditorialRepository;
import xyz.danielcortes.repository.IdiomaRepository;
import xyz.danielcortes.repository.LibroRepository;
import xyz.danielcortes.views.libro.LibroCreatePanel;

public class LibroCreateController {
  private IdiomaRepository idiomaRepository;
  private CategoriaRepository categoriaRepository;
  private AutorRepository autorRepository;
  private EditorialRepository editorialRepository;

  private LibroRepository libroRepository;

  private LibroCreatePanel view;
  private LibroValidator validator;

  public LibroCreateController(LibroCreatePanel view) {
    this.idiomaRepository = new IdiomaRepository();
    this.categoriaRepository = new CategoriaRepository();
    this.autorRepository = new AutorRepository();
    this.editorialRepository = new EditorialRepository();

    this.libroRepository = new LibroRepository();
    this.validator = new LibroValidator(this.libroRepository);
    this.view = view;

    this.loadIdiomasList();
    this.loadCategoriasList();
    this.loadAutorList();
    this.loadEditorialCombo();

    this.setupListeners();
  }

  private void setupListeners() {
    this.view.getGuardarButton().addActionListener(e -> save());
  }

  private void save() {
    String serie = this.view.getSerieField().getText();
    if(!validator.validateSerie(serie)) return;

    String isbn = this.view.getIsbnField().getText();
    if(!validator.validateISBN(isbn)) return;
    isbn = isbn.replaceAll("[^\\d]", "");

    String titulo = this.view.getTituloField().getText();
    if(!validator.validateTitulo(titulo)) return;

    String numeroPaginas = this.view.getPaginasField().getText();
    if(!validator.validateNumeroPaginas(numeroPaginas)) return;

    String anoPublicacion = this.view.getAnoPublicacionField().getText();
    if(!validator.validateAnoPublicacion(anoPublicacion)) return;

    String precioReferencial = this.view.getPrecioReferenciaField().getText();
    if(!validator.validatePrecioReferencia(precioReferencial)) return;

    List<Idioma> idiomas = this.view.getIdiomasList().getSelectedValuesList();
    if(!validator.validateIdiomas(idiomas)) return;

    List<Autor> autores = this.view.getAutoresList().getSelectedValuesList();
    if(!validator.validateAutores(autores)) return;

    List<Categoria> categorias = this.view.getCategoriasList().getSelectedValuesList();
    if(!validator.validateCategorias(categorias)) return;

    Editorial editorial = (Editorial) this.view.getEditorialCombo().getSelectedItem();
    if(!validator.validateEditorial(editorial)) return;

    Libro libro = new Libro();
    libro.setSerie(serie);
    libro.setIsbn(isbn);
    libro.setTitulo(titulo);
    libro.setNumeroPaginas(Integer.parseInt(numeroPaginas));
    libro.setAnoPublicacion(Year.of(Integer.parseInt(anoPublicacion)));
    libro.setPrecioReferencia(Integer.parseInt(precioReferencial));
    libro.setIdiomas(new HashSet<>(idiomas));
    libro.setAutores(new HashSet<>(autores));
    libro.setCategorias(new HashSet<>(categorias));
    libro.setEditorial(editorial);

    this.libroRepository.save(libro);

    this.view.getSerieField().setText("");
    this.view.getIsbnField().setText("");
    this.view.getTituloField().setText("");
    this.view.getPaginasField().setText("");
    this.view.getAnoPublicacionField().setText("");
    this.view.getPrecioReferenciaField().setText("");
    this.view.getIdiomasList().setSelectedIndices(new int[]{});
    this.view.getAutoresList().setSelectedIndices(new int[]{});
    this.view.getCategoriasList().setSelectedIndices(new int[]{});
    this.view.getEditorialCombo().setSelectedIndex(0);
    this.view.getSerieField().requestFocus();
  }

  public void reload() {
    loadIdiomasList();
    loadCategoriasList();
    loadAutorList();
    loadEditorialCombo();
  }

  private void loadIdiomasList() {
    List<Idioma> idiomas = idiomaRepository.getAll();
    DefaultListModel<Idioma> model = this.view.getIdiomasModel();
    model.clear();
    for (Idioma idioma : idiomas) {
      model.addElement(idioma);
    }
  }

  private void loadCategoriasList() {
    List<Categoria> categorias = categoriaRepository.getAll();
    DefaultListModel<Categoria> model = this.view.getCategoriasModel();
    model.clear();
    for (Categoria categoria: categorias) {
      model.addElement(categoria);
    }
  }

  private void loadAutorList() {
    List<Autor> autores = autorRepository.getAll();
    DefaultListModel<Autor> model = this.view.getAutoresModel();
    model.clear();
    for (Autor autor: autores) {
      model.addElement(autor);
    }
  }

  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 LibroCreatePanel getView() {
    return view;
  }

}
