package linea;

import java.awt.Color;

// Gère le fonctionnement du joueur (vie, collision, déplacement)
public class Joueur {

	protected Cercle demiCercleAvant;
	protected Cercle demiCercleArriere;

	protected int vies = 3;
	protected boolean enCollision = false;
	protected int compteurInvincible = 0;
	protected boolean invincibiliteRouge = false;

	protected boolean bonusTailleActif = false;
	protected int compteurBonusTaille = 0;

	protected boolean estMort = false;

	protected Color couleurAvant;
	protected Color couleurArriere;

	protected int toucheHaut;
	protected int toucheBas;

	public Joueur(Color couleurAvant, Color couleurArriere, int toucheHaut, int toucheBas) {
		this.demiCercleAvant = new Cercle(90, -180);
		this.demiCercleArriere = new Cercle(90, 180);
		this.couleurAvant = couleurAvant;
		this.couleurArriere = couleurArriere;
		this.toucheHaut = toucheHaut;
		this.toucheBas = toucheBas;
		appliquerCouleurs();
	}

	// Gère les contrôles du joueur
	public void appliquerTouche(int keyCode, boolean pressed) {
		if (estMort) return;

		if (keyCode == toucheHaut) {
			if (pressed) {
				demiCercleAvant.Monter();
				demiCercleArriere.Monter();
			} else {
				demiCercleAvant.ArreterMonter();
				demiCercleArriere.ArreterMonter();
			}
		}
		if (keyCode == toucheBas) {
			if (pressed) {
				demiCercleAvant.Descendre();
				demiCercleArriere.Descendre();
			} else {
				demiCercleAvant.ArreterDescendre();
				demiCercleArriere.ArreterDescendre();
			}
		}
	}

	public void mettreAJourRayon(double rayonBase) {
		double rayon = rayonBase;
		if (bonusTailleActif) {
			rayon += 30;
			compteurBonusTaille--;
			if (compteurBonusTaille <= 0) {
				bonusTailleActif = false;
			}
		}
		demiCercleAvant.setRayon(rayon);
		demiCercleArriere.setRayon(rayon);
	}

	//Appelé chaque frame et permet d'avancer le timer d'invincibilité et de mettre à jour l'effet visuel
	public void mettreAJourInvincibilite() {
		if (estMort) {
			demiCercleAvant.setCouleur(new Color(0, 0, 0, 0));
			demiCercleArriere.setCouleur(new Color(0, 0, 0, 0));
			return;
		}

		if (compteurInvincible < 75) {
			compteurInvincible++;

			if (compteurInvincible % 10 < 5) {
				if (invincibiliteRouge) {
					demiCercleArriere.setCouleur(new Color(1f, 0f, 0f));
					demiCercleAvant.setCouleur(new Color(1f, 0f, 0f));
				} else {
					demiCercleArriere.setCouleur(new Color(255, 255, 255, 150));
					demiCercleAvant.setCouleur(new Color(255, 255, 255, 150));
				}
			} else {
				appliquerCouleurs();
			}
		} else {
			appliquerCouleurs();
		}
	}

	public boolean estInvincible() {
		return compteurInvincible < 75;
	}

	public void verifierCollisionLigne(Ligne li) {
		if (estMort || estInvincible()) return;

		if (demiCercleArriere.VerifierCollision(li)) {
			if (!enCollision) {
				vies--;
				enCollision = true;
				compteurInvincible = 0;
				invincibiliteRouge = true;
			}
		} else {
			enCollision = false;
		}

		if (vies <= 0) {
			vies = 0;
			estMort = true;
		}
	}

	public boolean verifierCollisionCollectible(double itemX, double itemY, double itemTaille, double vitesseLigne) {
		if (estMort) return false;
		double centreX = itemX + (itemTaille / 2.0);
		if (centreX <= demiCercleAvant.x && centreX > demiCercleAvant.x - vitesseLigne) {
			double hautCercle = demiCercleAvant.y - demiCercleAvant.getRayon();
			double basCercle = demiCercleAvant.y + demiCercleAvant.getRayon();
			return itemY > hautCercle && (itemY + itemTaille) < basCercle;
		}
		return false;
	}

	public void resterDansLigne(Ligne li) {
		if (estMort) return;
		demiCercleArriere.ResterDansLigne(li);
		demiCercleAvant.ResterDansLigne(li);
	}

	public void activerBonusTaille() {
		bonusTailleActif = true;
		compteurBonusTaille = 150;
	}

	public void ajouterVie() {
		vies++;
	}

	public void retirerVie() {
		vies--;
		invincibiliteRouge = true;
		compteurInvincible = 0;
		if (vies <= 0) {
			vies = 0;
			estMort = true;
		}
	}

	public void resetInvincibilite() {
		compteurInvincible = 0;
		invincibiliteRouge = false;
	}

	public void appliquerCouleurs() {
		demiCercleArriere.setCouleur(couleurArriere);
		demiCercleAvant.setCouleur(couleurAvant);
	}

	public void ajouterDansEcran(ZoneDessin ecran) {
		ecran.ajouterObjet(demiCercleArriere);
		ecran.ajouterObjet(demiCercleAvant);
	}

	public void reinitialiser(double posY) {
		vies = 3;
		enCollision = false;
		compteurInvincible = 0;
		invincibiliteRouge = false;
		bonusTailleActif = false;
		compteurBonusTaille = 0;
		estMort = false;
		demiCercleAvant.y = posY;
		demiCercleAvant.vitesse = -1.0;
		demiCercleArriere.y = posY;
		demiCercleArriere.vitesse = -1.0;
		appliquerCouleurs();
	}
}
