package xyz.danielcortes.controllers;

import java.awt.event.KeyEvent;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JPanel;
import xyz.danielcortes.controllers.autor.AutorCreateController;
import xyz.danielcortes.controllers.autor.AutorDeleteController;
import xyz.danielcortes.controllers.autor.AutorListController;
import xyz.danielcortes.controllers.autor.AutorUpdateController;
import xyz.danielcortes.controllers.categoria.CategoriaCreateController;
import xyz.danielcortes.controllers.categoria.CategoriaDeleteController;
import xyz.danielcortes.controllers.categoria.CategoriaListController;
import xyz.danielcortes.controllers.categoria.CategoriaUpdateController;
import xyz.danielcortes.controllers.editorial.EditorialCreateController;
import xyz.danielcortes.controllers.editorial.EditorialDeleteController;
import xyz.danielcortes.controllers.editorial.EditorialListController;
import xyz.danielcortes.controllers.editorial.EditorialUpdateController;
import xyz.danielcortes.controllers.idioma.IdiomaCreateController;
import xyz.danielcortes.controllers.idioma.IdiomaDeleteController;
import xyz.danielcortes.controllers.idioma.IdiomaListController;
import xyz.danielcortes.controllers.idioma.IdiomaUpdateController;
import xyz.danielcortes.controllers.libro.LibroCreateController;
import xyz.danielcortes.controllers.libro.LibroDeleteController;
import xyz.danielcortes.controllers.libro.LibroListController;
import xyz.danielcortes.controllers.libro.LibroUpdateController;
import xyz.danielcortes.framework.PanelName;
import xyz.danielcortes.views.LaunchFrame;
import xyz.danielcortes.views.autor.AutorCreatePanel;
import xyz.danielcortes.views.autor.AutorDeletePanel;
import xyz.danielcortes.views.autor.AutorListPanel;
import xyz.danielcortes.views.autor.AutorUpdatePanel;
import xyz.danielcortes.views.categoria.CategoriaCreatePanel;
import xyz.danielcortes.views.categoria.CategoriaDeletePanel;
import xyz.danielcortes.views.categoria.CategoriaListPanel;
import xyz.danielcortes.views.categoria.CategoriaUpdatePanel;
import xyz.danielcortes.views.editorial.EditorialCreatePanel;
import xyz.danielcortes.views.editorial.EditorialDeletePanel;
import xyz.danielcortes.views.editorial.EditorialListPanel;
import xyz.danielcortes.views.editorial.EditorialUpdatePanel;
import xyz.danielcortes.views.idioma.IdiomaCreatePanel;
import xyz.danielcortes.views.idioma.IdiomaDeletePanel;
import xyz.danielcortes.views.idioma.IdiomaListPanel;
import xyz.danielcortes.views.idioma.IdiomaUpdatePanel;
import xyz.danielcortes.views.libro.LibroCreatePanel;
import xyz.danielcortes.views.libro.LibroDeletePanel;
import xyz.danielcortes.views.libro.LibroListPanel;
import xyz.danielcortes.views.libro.LibroUpdatePanel;

public class LaunchController {

  private LaunchFrame frame;

  private LibroListController libroListController;
  private LibroCreateController libroCreateController;
  private LibroUpdateController libroUpdateController;
  private LibroDeleteController libroDeleteController;

  private AutorListController autorListController;
  private AutorCreateController autorCreateController;
  private AutorUpdateController autorUpdateController;
  private AutorDeleteController autorDeleteController;

  private IdiomaListController idiomaListController;
  private IdiomaCreateController idiomaCreateController;
  private IdiomaUpdateController idiomaUpdateController;
  private IdiomaDeleteController idiomaDeleteController;

  private CategoriaListController categoriaListController;
  private CategoriaCreateController categoriaCreateController;
  private CategoriaUpdateController categoriaUpdateController;
  private CategoriaDeleteController categoriaDeleteController;

  private EditorialListController editorialListController;
  private EditorialCreateController editorialCreateController;
  private EditorialUpdateController editorialUpdateController;
  private EditorialDeleteController editorialDeleteController;

  private void create() {
    frame = new LaunchFrame();
    this.createCards();
    this.createMenuBar();
  }

  private void createCards() {
    this.frame.addCard(new JPanel(), PanelName.EMPTY);

    this.libroListController = new LibroListController(new LibroListPanel());
    this.libroCreateController = new LibroCreateController(new LibroCreatePanel());
    this.libroUpdateController = new LibroUpdateController(new LibroUpdatePanel());
    this.libroDeleteController = new LibroDeleteController(new LibroDeletePanel());

    this.frame.addCard(
        this.libroListController.getView().getContentPane(),
        PanelName.LIBRO_LIST
    );
    this.frame.addCard(
        this.libroCreateController.getView().getContentPane(),
        PanelName.LIBRO_CREATE
    );
    this.frame.addCard(
        this.libroUpdateController.getView().getContentPane(),
        PanelName.LIBRO_UPDATE
    );
    this.frame.addCard(
        this.libroDeleteController.getView().getContentPane(),
        PanelName.LIBRO_DELETE
    );

    this.autorListController = new AutorListController(new AutorListPanel());
    this.autorCreateController = new AutorCreateController(new AutorCreatePanel());
    this.autorUpdateController = new AutorUpdateController(new AutorUpdatePanel());
    this.autorDeleteController = new AutorDeleteController(new AutorDeletePanel());
    this.frame.addCard(
        this.autorListController.getView().getContentPane(),
        PanelName.AUTOR_LIST
    );
    this.frame.addCard(
        this.autorCreateController.getView().getContentPane(),
        PanelName.AUTOR_CREATE
    );
    this.frame.addCard(
        this.autorUpdateController.getView().getContentPane(),
        PanelName.AUTOR_UPDATE
    );
    this.frame.addCard(
        this.autorDeleteController.getView().getContentPane(),
        PanelName.AUTOR_DELETE
    );

    this.idiomaListController = new IdiomaListController(new IdiomaListPanel());
    this.idiomaCreateController = new IdiomaCreateController(new IdiomaCreatePanel());
    this.idiomaUpdateController = new IdiomaUpdateController(new IdiomaUpdatePanel());
    this.idiomaDeleteController = new IdiomaDeleteController(new IdiomaDeletePanel());
    this.frame.addCard(
        this.idiomaListController.getView().getContentPane(),
        PanelName.IDIOMA_LIST
    );
    this.frame.addCard(
        this.idiomaCreateController.getView().getContentPane(),
        PanelName.IDIOMA_CREATE
    );
    this.frame.addCard(
        this.idiomaUpdateController.getView().getContentPane(),
        PanelName.IDIOMA_UPDATE
    );
    this.frame.addCard(
        this.idiomaDeleteController.getView().getContentPane(),
        PanelName.IDIOMA_DELETE
    );

    this.categoriaListController = new CategoriaListController(new CategoriaListPanel());
    this.categoriaCreateController = new CategoriaCreateController(new CategoriaCreatePanel());
    this.categoriaDeleteController = new CategoriaDeleteController(new CategoriaDeletePanel());
    this.categoriaUpdateController = new CategoriaUpdateController(new CategoriaUpdatePanel());

    this.frame.addCard(
        this.categoriaListController.getView().getContentPane(),
        PanelName.CATEGORIA_LIST
    );
    this.frame.addCard(
        this.categoriaUpdateController.getView().getContentPane(),
        PanelName.CATEGORIA_UPDATE
    );
    this.frame.addCard(
        this.categoriaCreateController.getView().getContentPane(),
        PanelName.CATEGORIA_CREATE
    );
    this.frame.addCard(
        this.categoriaDeleteController.getView().getContentPane(),
        PanelName.CATEGORIA_DELETE
    );

    this.editorialListController = new EditorialListController(new EditorialListPanel());
    this.editorialCreateController= new EditorialCreateController(new EditorialCreatePanel());
    this.editorialUpdateController= new EditorialUpdateController(new EditorialUpdatePanel());
    this.editorialDeleteController= new EditorialDeleteController(new EditorialDeletePanel());

    this.frame.addCard(
        this.editorialListController.getView().getContentPane(),
        PanelName.EDITORIAL_LIST
    );
    this.frame.addCard(
        this.editorialCreateController.getView().getContentPane(),
        PanelName.EDITORIAL_CREATE
    );
    this.frame.addCard(
        this.editorialUpdateController.getView().getContentPane(),
        PanelName.EDITORIAL_UPDATE
    );
    this.frame.addCard(
        this.editorialDeleteController.getView().getContentPane(),
        PanelName.EDITORIAL_DELETE
    );
  }

  private void createMenuBar() {
    JMenuBar menuBar = new JMenuBar();

    //Si, los estoy poniendo en una linea en vez de las 2 que corresponden,
    //Lo hago porque se ve mas claramente a que Menu/MenuItem pertenece el mnemonic.
    //Es una especie de... Builder pobre :3
    // @formatter:off
    JMenu librosMenu = new JMenu("Libros"); librosMenu.setMnemonic(KeyEvent.VK_L);
    JMenuItem libroList = new JMenuItem("Listar"); libroList.setMnemonic(KeyEvent.VK_L);
    JMenuItem libroCreate = new JMenuItem("Crear"); libroCreate.setMnemonic(KeyEvent.VK_C);
    JMenuItem libroUpdate= new JMenuItem("Actualizar"); libroUpdate.setMnemonic(KeyEvent.VK_U);
    JMenuItem libroDelete = new JMenuItem("Eliminar"); libroDelete.setMnemonic(KeyEvent.VK_E);

    JMenu autoresMenu = new JMenu("Autores"); autoresMenu.setMnemonic(KeyEvent.VK_A);
    JMenuItem autorList = new JMenuItem("Listar"); autorList.setMnemonic(KeyEvent.VK_L);
    JMenuItem autorCreate = new JMenuItem("Crear"); autorCreate.setMnemonic(KeyEvent.VK_C);
    JMenuItem autorUpdate = new JMenuItem("Actualizar"); autorUpdate.setMnemonic(KeyEvent.VK_A);
    JMenuItem autorDelete = new JMenuItem("Eliminar"); autorDelete.setMnemonic(KeyEvent.VK_E);

    JMenu idiomasMenu = new JMenu("Idiomas"); idiomasMenu.setMnemonic(KeyEvent.VK_I);
    JMenuItem idiomaList = new JMenuItem("Listar"); idiomaList.setMnemonic(KeyEvent.VK_L);
    JMenuItem idiomaCreate = new JMenuItem("Crear"); idiomaCreate.setMnemonic(KeyEvent.VK_C);
    JMenuItem idiomaUpdate = new JMenuItem("Actualizar"); idiomaUpdate.setMnemonic(KeyEvent.VK_A);
    JMenuItem idiomaDelete = new JMenuItem("Eliminar"); idiomaDelete.setMnemonic(KeyEvent.VK_E);

    JMenu categoriasMenu = new JMenu("Categorias"); categoriasMenu.setMnemonic(KeyEvent.VK_C);
    JMenuItem categoriaList = new JMenuItem("Listar"); categoriaList.setMnemonic(KeyEvent.VK_L);
    JMenuItem categoriaCreate = new JMenuItem("Crear"); categoriaCreate.setMnemonic(KeyEvent.VK_C);
    JMenuItem categoriaUpdate = new JMenuItem("Actualizar"); categoriaUpdate.setMnemonic(KeyEvent.VK_A);
    JMenuItem categoriaDelete = new JMenuItem("Eliminar"); categoriaDelete.setMnemonic(KeyEvent.VK_E);

    JMenu editorialesMenu = new JMenu("Editoriales"); editorialesMenu.setMnemonic(KeyEvent.VK_E);
    JMenuItem editorialList= new JMenuItem("Listar"); editorialList.setMnemonic(KeyEvent.VK_L);
    JMenuItem editorialCreate= new JMenuItem("Crear"); editorialCreate.setMnemonic(KeyEvent.VK_C);
    JMenuItem editorialUpdate = new JMenuItem("Actualizar"); editorialUpdate.setMnemonic(KeyEvent.VK_A);
    JMenuItem editorialDelete = new JMenuItem("Eliminar"); editorialDelete.setMnemonic(KeyEvent.VK_E);
    // @formatter:on

    autorList.addActionListener(e -> {
      this.autorListController.reload();
      this.frame.showCard(PanelName.AUTOR_LIST);
    });
    autorCreate.addActionListener(e -> {
      this.frame.showCard(PanelName.AUTOR_CREATE);
      this.autorCreateController.getView().getNombreField().requestFocus();
    });
    autorUpdate.addActionListener(e -> {
      this.autorUpdateController.reload();
      this.frame.showCard(PanelName.AUTOR_UPDATE);
      this.autorUpdateController.getView().getAutorCombo().requestFocus();
    });
    autorDelete.addActionListener(e -> {
      this.autorDeleteController.reload();
      this.frame.showCard(PanelName.AUTOR_DELETE);
      this.autorDeleteController.getView().getAutorCombo().requestFocus();
    });

    idiomaList.addActionListener(e -> {
      this.idiomaListController.reload();
      this.frame.showCard(PanelName.IDIOMA_LIST);
    });
    idiomaCreate.addActionListener(e -> {
      this.frame.showCard(PanelName.IDIOMA_CREATE);
      this.idiomaCreateController.getView().getNombreField().requestFocus();
    });
    idiomaUpdate.addActionListener(e -> {
      this.idiomaUpdateController.reload();
      this.frame.showCard(PanelName.IDIOMA_UPDATE);
      this.idiomaUpdateController.getView().getIdiomaCombo().requestFocus();
    });
    idiomaDelete.addActionListener(e -> {
      this.idiomaDeleteController.reload();
      this.frame.showCard(PanelName.IDIOMA_DELETE);
      this.idiomaDeleteController.getView().getIdiomaCombo().requestFocus();
    });

    libroList.addActionListener(e -> {
      this.libroListController.reload();
      this.frame.showCard(PanelName.LIBRO_LIST);
    });
    libroCreate.addActionListener(e -> {
      this.libroCreateController.reload();
      this.frame.showCard(PanelName.LIBRO_CREATE);
      this.libroCreateController.getView().getSerieField().requestFocus();
    });
    libroUpdate.addActionListener(e -> {
      this.libroUpdateController.reload();
      this.frame.showCard(PanelName.LIBRO_UPDATE);
      this.libroUpdateController.getView().getSerieField().requestFocus();
    });
    libroDelete.addActionListener(e -> {
      this.libroDeleteController.reload();
      this.frame.showCard(PanelName.LIBRO_DELETE);
    });

    categoriaList.addActionListener(e -> {
      this.categoriaListController.reload();
      this.frame.showCard(PanelName.CATEGORIA_LIST);
    });
    categoriaCreate.addActionListener(e -> {
      this.frame.showCard(PanelName.CATEGORIA_CREATE);
      this.categoriaCreateController.getView().getNombreField().requestFocus();
    });
    categoriaUpdate.addActionListener(e -> {
      this.categoriaUpdateController.reload();
      this.frame.showCard(PanelName.CATEGORIA_UPDATE);
      this.categoriaUpdateController.getView().getCategoriaCombo().requestFocus();
    });
    categoriaDelete.addActionListener(e -> {
      this.categoriaDeleteController.reload();
      this.frame.showCard(PanelName.CATEGORIA_DELETE);
      this.categoriaDeleteController.getView().getCategoriaCombo().requestFocus();
    });

    editorialList.addActionListener(e -> {
      this.editorialListController.reload();
      this.frame.showCard(PanelName.EDITORIAL_LIST);
    });
    editorialCreate.addActionListener(e -> {
      this.frame.showCard(PanelName.EDITORIAL_CREATE);
      this.editorialCreateController.getView().getNombreField().requestFocus();
    });
    editorialUpdate.addActionListener(e -> {
      this.editorialUpdateController.reload();
      this.frame.showCard(PanelName.EDITORIAL_UPDATE);
      this.editorialUpdateController.getView().getEditorialCombo().requestFocus();
    });
    editorialDelete.addActionListener(e -> {
      this.editorialDeleteController.reload();
      this.frame.showCard(PanelName.EDITORIAL_DELETE);
      this.editorialDeleteController.getView().getEditorialCombo().requestFocus();
    });

    menuBar.add(librosMenu);
    librosMenu.add(libroList);
    librosMenu.add(libroCreate);
    librosMenu.add(libroUpdate);
    librosMenu.add(libroDelete);

    menuBar.add(autoresMenu);
    autoresMenu.add(autorList);
    autoresMenu.add(autorCreate);
    autoresMenu.add(autorUpdate);
    autoresMenu.add(autorDelete);

    menuBar.add(idiomasMenu);
    idiomasMenu.add(idiomaList);
    idiomasMenu.add(idiomaCreate);
    idiomasMenu.add(idiomaUpdate);
    idiomasMenu.add(idiomaDelete);

    menuBar.add(categoriasMenu);
    categoriasMenu.add(categoriaList);
    categoriasMenu.add(categoriaCreate);
    categoriasMenu.add(categoriaUpdate);
    categoriasMenu.add(categoriaDelete);

    menuBar.add(editorialesMenu);
    editorialesMenu.add(editorialList);
    editorialesMenu.add(editorialCreate);
    editorialesMenu.add(editorialUpdate);
    editorialesMenu.add(editorialDelete);

    this.frame.setJMenuBar(menuBar);
  }

  public void run() {
    this.create();
    this.frame.setVisible(true);
  }

}
