package com.charpentierbalocchi.dorfjavatik.controller;

import com.charpentierbalocchi.dorfjavatik.model.Plateau;
import com.charpentierbalocchi.dorfjavatik.model.Tuile;
import com.charpentierbalocchi.dorfjavatik.util.GenerateurTuile;
import com.charpentierbalocchi.dorfjavatik.view.FenetreJeu;

public class ControleurJeu {
    private FenetreJeu fenetreJeu;
    private Plateau plateau;
    private GenerateurTuile generateurTuile;

    public ControleurJeu(FenetreJeu fenetreJeu, int taillePlateau) {
        this.fenetreJeu = fenetreJeu;
        this.plateau = new Plateau(taillePlateau); // Initialisation du plateau de jeu avec la taille spécifiée
        this.generateurTuile = new GenerateurTuile(); // Générateur de tuiles aléatoires
    }

    public void setFenetreJeu(FenetreJeu fenetreJeu) {
        this.fenetreJeu = fenetreJeu;
    }

    public void demarrerJeu() {
        plateau.reset();
        fenetreJeu.setScore(0);
        fenetreJeu.resetBoard();
        genererNouvelleTuile();
    }

    public void handleTilePlacement(int x, int y) {
        Tuile tuileCourante = fenetreJeu.getTuileCourante();
        if (tuileCourante != null && plateau.placerTuile(tuileCourante, x, y)) {
            int score = plateau.calculerScore(x, y, tuileCourante);
            fenetreJeu.setScore(score);
            fenetreJeu.setScore(plateau.getScore());
            fenetreJeu.updateBoard(x, y, tuileCourante);
            if (plateauEstComplet()) {
                fenetreJeu.afficherMessage("Partie terminée ! Votre score final est : " + plateau.getScore());
            } else {
                genererNouvelleTuile();
            }
        }
    }

    public void genererNouvelleTuile() {
        Tuile nouvelleTuile = generateurTuile.genererTuileAleatoire();
        fenetreJeu.setTuileCourante(nouvelleTuile);
    }

    private boolean plateauEstComplet() {
        for (int i = 0; i < plateau.getTaille(); i++) {
            for (int j = 0; j < plateau.getTaille(); j++) {
                if (plateau.getCase(i, j).estVide()) {
                    return false;
                }
            }
        }
        return true;
    }
}
