package fr.iutfbleau.papillon;

import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.util.ArrayList;
import java.util.List;


/**
 * La classe <code>Main</code> représente la fenêtre principale
 * de l’application <b>Papillon</b>.
 * <p>
 * Elle gère l’affichage des rappels, leur tri, ainsi que les
 * interactions avec les boutons d’ajout, de suppression et de modification.
 * </p>
 *
 * @version 1.0
 * @author Seri-khane YOLOU, Aylane SEHL, Jenson VAL
 */
public class Main extends JFrame implements ActionListener{

    /** Liste des panneaux représentant les rappels. */
    private List<PanelRappel> listRpl = new ArrayList<>();

    /** Panneau contenant la liste des rappels. */
    private JPanel liste = new JPanel();

    /** Menu déroulant permettant de trier les rappels par priorité. */
    private ChoixRang trier = new ChoixRang();

    /** Conteneur racine de la fenêtre principale. */
    private JPanel root = new JPanel(new BorderLayout());

    /**
     * Constructeur de la fenêtre principale de l’application.
     * <p>
     * Initialise les composants graphiques, configure la disposition et
     * charge la liste des rappels au démarrage.
     * </p>
     */
    public Main(){
    super("Papillon");
    ImageIcon logo = new ImageIcon("logo.png");
    setIconImage(logo.getImage());

    trier = new ChoixRang();
    trier.addActionListener(this);
//  Taille fixe 
    setSize(350, 250);
    setResizable(false);
    setAlwaysOnTop(true);
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

    //  Titre en haut  
    JLabel titre = new JLabel("Rappel : Papillon", SwingConstants.CENTER);
    titre.setBorder(BorderFactory.createEmptyBorder(6,10,6,10)); 
    // titre.setBackground(Color.CYAN);
    
    // ----- Grille centrale -----
    JPanel body = new JPanel(new GridBagLayout());
    GridBagConstraints c = new GridBagConstraints();
    
    Crud crud = new Crud(this);

    // Colonne 0 : boutons
    c.fill = GridBagConstraints.HORIZONTAL;
    c.anchor = GridBagConstraints.NORTHWEST;
    c.insets = new Insets(4, 4, 4, 4);
    for(int i = 0; i< crud.size() ;i++){
    c.gridx = i; 
    c.gridy = 4;
    c.weighty = 0; 
    c.weightx = 1; 
    body.add(crud.get(i), c);
    }

    // Colonne 1 : liste verticale de Rappel dans un JScrollPane
    liste = new JPanel();
    
    //Rappels
    this.setTrie(trier.getSelectedIndex());
    liste=this.getRPanel();

liste.setLayout(new BoxLayout(liste, BoxLayout.Y_AXIS)); 
    JScrollPane scroll = new JScrollPane(
        liste,
        JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED,
        JScrollPane.HORIZONTAL_SCROLLBAR_NEVER
    );
    scroll.getVerticalScrollBar().setUnitIncrement(16); // molette fluide

    // place le scrollpane a droite, sur la hauteur des 2 lignes
    c.gridx = 0; c.gridy = 1; c.gridwidth = 3;
    c.fill = GridBagConstraints.BOTH;
    c.insets = new Insets(0, 0, 0, 0);
    c.weightx = 1.0;  // prend la largeur dispo
    c.weighty = 1.0;  // prend la hauteur dispo
    body.add(scroll, c);

    c.gridx=0; c.gridy=0;
    c.weightx = 0.0; c.weighty = 0.0;
    c.fill = GridBagConstraints.NONE;
    c.anchor = GridBagConstraints.SOUTHEAST;
    c.insets = new Insets(1, 1, 1, 1);
    body.add(trier,c);

    // Conteneur racine
    
    root.add(titre, BorderLayout.NORTH);
    root.add(body, BorderLayout.CENTER);
    setContentPane(root);

    }

    /**
     * Renvoie la liste des panneaux de rappels actuellement affichés.
     *
     * @return une liste de <code>PanelRappel</code>
     */
public List<PanelRappel> getPanelRpl(){
    return listRpl;
}

    /**
     * Met à jour la fenêtre principale après une modification
     * (ajout, suppression ou édition d’un rappel).
     * <p>
     * Cette méthode recharge le panneau des rappels
     * et force le recalcul de l’affichage.
     * </p>
     */
public void maj(){

    liste = this.getRPanel();
    liste.revalidate(); // recalcul du layout
    liste.repaint(); 
    
    this.revalidate();
    this.repaint();
}

    /**
     * Applique un tri des rappels selon leur rang de priorité.
     *
     * @param rang le niveau de priorité sélectionné dans le menu
     */
public void setTrie(int rang){
    listRpl = new ArrayList<>();

            GestionRappel g = new GestionRappel();
            List<Rappel> listBd = new ArrayList<>();

            try {
                listBd = g.lister();
            } catch (Exception ex) {
                ex.printStackTrace(); 
            }

if(rang>0){
for(int i=0;i<listBd.size();i++){
    PanelRappel rappel = new PanelRappel(listBd.get(i), this);
    if(listBd.get(i).getRang()==rang){
        liste.add(rappel);
        listRpl.add(rappel);
    }
}
}else{
   for (int i = 0; i < listBd.size() ; i++) {
        PanelRappel r = new PanelRappel(listBd.get(i), this); 
        liste.add(r); 
        listRpl.add(r);
    } 
}

}

    /**
     * Renvoie le panneau contenant les rappels.
     *
     * @return le panneau de type <code>JPanel</code> affichant les rappels
     */
public JPanel getRPanel(){
    return liste;
}

    /**
     * Gère les actions utilisateur sur le menu déroulant de tri.
     * <p>
     * Réinitialise la liste et applique le tri sélectionné.
     * </p>
     *
     * @param ea l’événement d’action déclenché
     */
    @Override
    public void actionPerformed(ActionEvent ea) {

        liste.removeAll();
        trier.tirage(this);
    
    }

}