package linea;

import java.awt.Color;
import java.util.ArrayList;
import java.util.List;

public class GestionnaireNiveau {

	public static final int FRAMES_PAR_NIVEAU = 25 * 10; // 10s a 25 FPS (timer 40ms)

	private final List<Niveau> niveaux = new ArrayList<>();
	private int indexNiveau = 0;
	private int framesDepuisDebut = 0;
	private int framesDansNiveau = 0;

	// Duree du fade en frames
	private static final int DUREE_FADE = 75; // 3 secondes

	public GestionnaireNiveau() {

		// Niveau 1 : lisse, cercle large
		niveaux.add(new Niveau(1,
			new Color(0, 73, 220),
			8, 1 / 80.0, 80, 100, 500));

		// Niveau 2
		niveaux.add(new Niveau(2,
			new Color(75, 0, 180),
			10, 1 / 60.0, 60, 100, 500));

		// Niveau 3
		niveaux.add(new Niveau(3,
			new Color(83, 30, 39),
			12, 1 / 40.0, 50, 100, 500));

		// Niveau 4
		niveaux.add(new Niveau(4,
			new Color(20, 100, 40),
			14, 1 / 30.0, 40, 100, 500));

		// Niveau 5 : chaos, cercle petit
		niveaux.add(new Niveau(5,
			new Color(30, 30, 30),
			16, 1 / 20.0, 30, 100, 500));
	}

	public void mettreAJour() {
		framesDepuisDebut++;
		framesDansNiveau++;

		if (framesDansNiveau >= FRAMES_PAR_NIVEAU && indexNiveau < niveaux.size() - 1) {
			indexNiveau++;
			framesDansNiveau = 0;
		}
	}

	public Niveau getNiveauActuel() {
		return niveaux.get(indexNiveau);
	}

	public int getNumeroNiveau() {
		return niveaux.get(indexNiveau).numero;
	}

	public Color getCouleurFondInterpolee() {
		if (framesDansNiveau < DUREE_FADE && indexNiveau > 0) {
			Color de = niveaux.get(indexNiveau - 1).couleurFond;
			Color vers = niveaux.get(indexNiveau).couleurFond;
			double t = (double) framesDansNiveau / DUREE_FADE;
			return interpolerCouleur(de, vers, t);
		}
		return niveaux.get(indexNiveau).couleurFond;
	}

	public double getVitesseScroll() {
		if (framesDansNiveau < DUREE_FADE && indexNiveau > 0) {
			double de = niveaux.get(indexNiveau - 1).vitesseScroll;
			double vers = niveaux.get(indexNiveau).vitesseScroll;
			double t = (double) framesDansNiveau / DUREE_FADE;
			return de + (vers - de) * t;
		}
		return niveaux.get(indexNiveau).vitesseScroll;
	}

	public double getNoiseFrequence() {
		if (framesDansNiveau < DUREE_FADE && indexNiveau > 0) {
			double de = niveaux.get(indexNiveau - 1).noiseFrequence;
			double vers = niveaux.get(indexNiveau).noiseFrequence;
			double t = (double) framesDansNiveau / DUREE_FADE;
			return de + (vers - de) * t;
		}
		return niveaux.get(indexNiveau).noiseFrequence;
	}

	public double getRayonCercle() {
		if (framesDansNiveau < DUREE_FADE && indexNiveau > 0) {
			double de = niveaux.get(indexNiveau - 1).rayonCercle;
			double vers = niveaux.get(indexNiveau).rayonCercle;
			double t = (double) framesDansNiveau / DUREE_FADE;
			return de + (vers - de) * t;
		}
		return niveaux.get(indexNiveau).rayonCercle;
	}

	public double getLimiteHaut() {
		return niveaux.get(indexNiveau).limiteHaut;
	}

	public double getLimiteBas() {
		return niveaux.get(indexNiveau).limiteBas;
	}

	public void reinitialiser() {
		indexNiveau = 0;
		framesDepuisDebut = 0;
		framesDansNiveau = 0;
	}

	private static Color interpolerCouleur(Color de, Color vers, double t) {
		int r = (int) (de.getRed() + (vers.getRed() - de.getRed()) * t);
		int g = (int) (de.getGreen() + (vers.getGreen() - de.getGreen()) * t);
		int b = (int) (de.getBlue() + (vers.getBlue() - de.getBlue()) * t);
		return new Color(
			Math.max(0, Math.min(255, r)),
			Math.max(0, Math.min(255, g)),
			Math.max(0, Math.min(255, b))
		);
	}
}
