package fr.iutfbleau.projetAgile.Menu.View;

import java.awt.*;
import javax.swing.JPanel;
import javax.swing.JFrame;
import javax.swing.JLabel;

import fr.iutfbleau.projetAgile.Jeu;
import fr.iutfbleau.projetAgile.Menu.Controller.*;
import fr.iutfbleau.projetAgile.Puissance4.LancementPuissance4;
import java.awt.event.WindowListener;

public abstract class Menu{
    public static String PUISSANCE_4="puissance4";
    public static String MENU="Menu";
    private static JFrame frame=new JFrame("Argile");
    private static CardLayout cd=new CardLayout();
    private static String JEU="Jeu";

    /**
     * methode static pour avoir le JPanel Affichant le Menu
     * @return un JPanel instancier avec les composant du menu
     * 
     */
    public static JPanel InitMenu(){
        JPanel p=new JPanel();
        p.setBackground(new Color(31,31,31));
        GridBagLayout gbl=new GridBagLayout();
        p.setLayout(gbl);
        GridBagConstraints gbc=new GridBagConstraints();
        gbc.gridx=0;
        gbc.gridy=0;
        gbc.gridwidth=3;
        gbc.gridheight=1;
        gbc.fill=GridBagConstraints.BOTH;
        gbc.anchor=GridBagConstraints.CENTER;
        gbc.weightx=2;
        gbc.weighty=0;
        gbc.insets=new Insets(0,10,0,10);
        JLabel titre=new JLabel("ARGILE GAMES");
        titre.setHorizontalAlignment(JLabel.CENTER);
        titre.setForeground(new Color(255,255,255));
        titre.setBackground(new Color(55,55,55));
        titre.setFont(new Font("Serif" ,Font.BOLD, 50));
        titre.setPreferredSize(new Dimension(400,200));
        p.add(titre, gbc);
        
        BoutonsMenu puissance_4=new BoutonsMenu(Menu.PUISSANCE_4, true);
        BoutonsMenu echecs=new BoutonsMenu("echecs", false);
        BoutonsMenu dames=new BoutonsMenu("dames", false);

        BoutonsMenu demineur=new BoutonsMenu("demineur", false);
        BoutonsMenu taquin=new BoutonsMenu("taquin", false);
        BoutonsMenu morpion=new BoutonsMenu("morpion", false);

        BoutonsMenu CoD=new BoutonsMenu("snake", false);
        BoutonsMenu minecraft=new BoutonsMenu("minigolf", false);
        BoutonsMenu puzzle=new BoutonsMenu("puzzle", false);

        ObservateurMenuSouris obser=new ObservateurMenuSouris();
        puissance_4.addMouseListener(obser);
        echecs.addMouseListener(obser);
        dames.addMouseListener(obser);

        demineur.addMouseListener(obser);
        taquin.addMouseListener(obser);
        morpion.addMouseListener(obser);

        CoD.addMouseListener(obser);
        minecraft.addMouseListener(obser);
        puzzle.addMouseListener(obser);

        p.add(puissance_4, Menu.GridBagConstraintsRetour(0, 1));
        p.add(echecs, Menu.GridBagConstraintsRetour(1, 1));
        p.add(dames, Menu.GridBagConstraintsRetour(2, 1));

        p.add(demineur, Menu.GridBagConstraintsRetour(0, 2));
        p.add(taquin, Menu.GridBagConstraintsRetour(1, 2));
        p.add(morpion, Menu.GridBagConstraintsRetour(2, 2));

        p.add(CoD, Menu.GridBagConstraintsRetour(0, 3));
        p.add(minecraft, Menu.GridBagConstraintsRetour(1, 3));
        p.add(puzzle, Menu.GridBagConstraintsRetour(2, 3));
        return p;
    }

    /**
     * methode priver pour calculer la positions des composants
     * 
     * @return le GridBagConstraints correspondants aux arguments
     * @param collonne sa place dans la collonne
     * @param ligne sa ligne
     */
    private static GridBagConstraints GridBagConstraintsRetour(int collonne, int ligne){
        GridBagConstraints gbc=new GridBagConstraints();
        gbc.gridx=collonne;
        gbc.gridy=ligne;
        gbc.gridwidth=1;
        gbc.gridheight=1;
        gbc.fill=GridBagConstraints.BOTH;
        gbc.anchor=GridBagConstraints.CENTER;
        gbc.weightx=1;
        gbc.weighty=1;
        Insets marge=new Insets(0,0,0,0);
        if(collonne==0){
            marge.set(5, 50, 5, 5);
        }
        if(collonne==2){
            marge.set(5, 5, 5, 50);
        }
        if(collonne==1){
            marge.set(5, 5, 5, 5);
        }
        if(ligne==3 && collonne==1){
            marge.set(5, 5, 50, 5);
        }
        if(ligne==3 && collonne==0){
            marge.set(5, 50, 50, 5);
        }
        if(ligne==3 && collonne==2){
            marge.set(5, 5, 50, 50);
        }
        gbc.insets=marge;
        return gbc;
    }

    /**
     * Methode pour changer le cardLayout
     * 
     * @param g
     * le string de la carte correspondant

     */
    public static void show(String g)
    {   
        if((g==Menu.MENU || g==Menu.PUISSANCE_4)){
            if(g==Menu.MENU)
            Menu.cd.show(Menu.frame.getContentPane(), g);
            else{
                Jeu jeu = null;
                if(g==Menu.PUISSANCE_4){
                    try{
                        jeu = new LancementPuissance4(Menu.frame);
                    }catch(Exception e){
                        return;
                    }
                }
                jeu.accueilButton(new ObservateurAccueil(jeu.getPanel()));
                Menu.frame.add(jeu.getPanel(), Menu.JEU);
                Menu.cd.show(Menu.frame.getContentPane(), Menu.JEU);
            }
        }
    }
    /**
     * getter pouvant initialiser la JFrame
     * @return
     * la fenetre
     */
    public static JFrame getFrame(){
        if(Menu.frame.getLayout()!=Menu.cd){
            Menu.frame.setLayout(Menu.cd);
            Menu.frame.setMinimumSize(new Dimension(1280,720));
            Menu.frame.setLocation(200,200);
        }
        WindowListener[] wl=Menu.frame.getWindowListeners();
        if(wl.length==0){
            Menu.frame.setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);
            Menu.frame.addWindowListener(new ObservateurFenetre(Menu.frame));
        }
        return Menu.frame;
    }
}