package org.Models;

import java.awt.Point;
import java.util.Observable;

import org.Models.Pieces.PieceL;

@SuppressWarnings("deprecation")
public class Jeu extends Observable implements Runnable {
    private Grille grille;
    private Ordonnanceur ordonnanceur;
    private Musique musique;

    private PieceCourante pieceSuivante;
    private int pieceSuivanteX;
    private int pieceSuivanteY;

    // TODO : remove test variable
    public int test = 0;

    public boolean jeuEnCours = true;

    public Jeu(Grille grille, Musique musique) {
        this.grille = grille;
        this.musique = musique;

        this.grille.setPieceCourante(getNouvellePiece());
        this.pieceSuivante = getNouvellePiece();

        this.ordonnanceur = new Ordonnanceur(this, 1000);
        this.ordonnanceur.start();
    }

    private PieceCourante getNouvellePiece() {
        this.pieceSuivante = new PieceL();
        this.pieceSuivanteX = 3;
        this.pieceSuivanteY = 0;
        return pieceSuivante;
    }

    public PieceCourante getPieceSuivante() {
        return pieceSuivante;
    }

    public int getPieceSuivanteX() {
        return pieceSuivanteX;
    }

    public int getPieceSuivanteY() {
        return pieceSuivanteY;
    }

    public Grille getGrille() {
        return grille;
    }

    public boolean estFinPartie() {
        for (Point caseColoree : this.grille.motifPieceCouranteColoriee()) {
            if (this.grille.getCase(caseColoree.y, caseColoree.x)) {
                return true;
            }
        }

        return false;
    }

    public void finPartie() {
        this.jeuEnCours = false;
        ordonnanceur.interrupt();
        if (musique != null) {
            System.out.println("Arret musique");
            musique.arreterMusique();
        }
        setChanged();
        notifyObservers();
    }

    @Override
    public void run() {
        // TODO: game logic here
        if (!jeuEnCours || grille.estEnPause()) {
            return;
        }

        if (estFinPartie()) {
            finPartie();
            return;
        }

        if (!this.grille.doitFixerPiece()) {
            this.grille.deplacerPiece(Direction.BAS);
        } else {
            this.grille.fixerPiece();
            this.grille.setPieceCourante(getNouvellePiece());
        }

        setChanged();
        notifyObservers();
    }
}
