package fr.iutfbleau.projetAgile.Puissance4;

import fr.iutfbleau.projetAgile.Jeu;
import fr.iutfbleau.projetAgile.Puissance4.Controller.Puissance4Controller;
import fr.iutfbleau.projetAgile.Puissance4.View.Grille;
import fr.iutfbleau.projetAgile.Puissance4.View.ColorChooserDialog;
import fr.iutfbleau.projetAgile.Puissance4.Model.GrilleModel;
import java.awt.event.ActionListener;
import java.sql.Connection;
import java.sql.DriverManager;
import org.mariadb.jdbc.*;
import java.sql.Statement;
import java.util.concurrent.CancellationException;

import javax.swing.ButtonGroup;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JRadioButton;

/**
 * Classe qui initialise une partie de Puissance 4 
 */
public class LancementPuissance4 implements Jeu{

    private Puissance4Controller P4;
    /**
     * Demande aux utilisateurs d'entrer leur nom puis initialise une partie
     * @param fenetre La fenetre dans laquelle le panneau sera ajouté. Peut-être null mais la fenetre de dialogue ne sera pas centré avec la fenetre du jeu 
     * @throws CancellationException Renvoie une exception si les utilisateurs annule le lancement de la partie
     */
    public LancementPuissance4(JFrame fenetre) throws CancellationException{
        String J1 = null;
        String J2 = null;
        String J3 = null;
        int playerNumber;
        JRadioButton twoPlayer = new JRadioButton("Deux joueurs");
        JRadioButton threePlayer = new JRadioButton("Trois joueurs");
        ButtonGroup buttons = new ButtonGroup();
        buttons.add(twoPlayer);
        buttons.add(threePlayer);
        Object[] message = {
            "Combien de joueurs ?", twoPlayer, threePlayer
        };
        int choix = JOptionPane.showConfirmDialog(fenetre, message, "Entrez le nombre de joueur", JOptionPane.OK_CANCEL_OPTION, JOptionPane.PLAIN_MESSAGE);
        if(choix != JOptionPane.OK_OPTION) {
            throw new CancellationException("User cancelled");
        }   
        
        if(buttons.getSelection() == twoPlayer.getModel())
            playerNumber = 2;
        else 
            playerNumber = 3;

        ColorChooserDialog chooser = new ColorChooserDialog(fenetre, true, playerNumber);
        if (chooser.getChoice()) {
            J1 = chooser.getPlayerOneName();
            J2 = chooser.getPlayerTwoName();
            if(playerNumber == 3) 
                J3 = chooser.getPlayerThreeName();
        } else {
            throw new CancellationException("User cancelled");
        }

        this.sendToDatabase(playerNumber);
        Grille g=new Grille();
        GrilleModel m=new GrilleModel(playerNumber);
        this.P4 = new Puissance4Controller(g, m);
        if(playerNumber == 2)
            this.P4.changeName(J1, J2);
        else    
            this.P4.changeName(J1, J2, J3);
        this.P4.initPanel();
    }

    @Override
    /**
     * Ajoute un ActionListener pour le bouton "accueil" du panneau du Puissance 4
     * @param l l'ActionListener à ajouter
     */
    public void accueilButton(ActionListener l){
        this.P4.accueilButton(l);
    }

    @Override
    /**
     * Retourne le panneau du jeu (la vue)
     * @return JPanel qui contient le Puissance 4
     */
    public JPanel getPanel(){
        return this.P4.getPanel();
    }

    public void sendToDatabase(int playerNumber) {
        try {

            Class.forName("org.mariadb.jdbc.Driver"); //Verification du pilote
            Connection conn = DriverManager.getConnection("jdbc:mariadb://dwarves.iut-fbleau.fr/justiney", "justiney", "motdepasseJustiney");
      
            try {
                Statement req = conn.createStatement();
                //------ Requete preparee -------- 
                if(playerNumber == 2)
                    req.executeUpdate("UPDATE SondageMarchePuissance4 SET twoPlayer = twoPlayer + 1");
                else
                    req.executeUpdate("UPDATE SondageMarchePuissance4 SET threePlayer = threePlayer + 1");
    
                req.close();
              
            } catch (Exception e) {
              System.err.println("Probleme requete");
              e.printStackTrace();
            }
      
            conn.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

}
