package entity;

import java.net.URL;
import java.util.List;

import environnement.Coordonnees;
import environnement.HitBox;
import jeu.Jeu;
import map.Obstacle;

import static jeu.Jeu.getMonsterList;

public class Kunai {
    private final int direction; //1 si vers la droite, -1 si vers la gauche
    private final int damage;
    private final double vitesse = 5;
    private HitBox hitBox;
    private Coordonnees coord;
    private final Coordonnees coordInit; //coordonnees initiales
    private boolean disappear = false; //variable disant si le kunai doit disparaitre ou non
    private static final int height = 12;
    private static final int width = 24;
    private final String sprite;

    public Kunai(int dir,int dmg,Coordonnees c){
        coord = c;
        coordInit = coord;
        damage = dmg;
        direction = dir;
        hitBox = new HitBox(coord,height,width);

        //cest la pour les sprites, remplacer Jeu.class par classedanslaquelletues.class
        String fn = "Frames_perso";
        URL url = Monster.class.getClassLoader().getResource(fn);
        assert url != null;
        String beginPath = url.toString().substring(6)+"/";
        String d;
        if (direction == 1)d = "_R1";
        else d = "_L1";
        sprite = beginPath + "character_kunai" + d + ".png";
        //************************* */
    }

    private void deplacement(){ //deplacement du kunai
        double newX = coord.getX() + direction*vitesse;
        this.coord = new Coordonnees(newX, this.coord.getZ());
    }

    private void updateHitBox(){ //on update la hitbox du kunai
        hitBox = new HitBox(coord,height,width);
    }

    private void dealsDamage(Entity entity){
        if (HitBox.collision(hitBox, entity.getHitBox())){
            if (entity.nbFramesInvincible == 0){
                entity.setNbLifePoints(Math.max(entity.getNbLifePoints()-damage,0));
                entity.nbFramesInvincible = entity.nbMaxFramesInvicible;//l'entity devient invincible qq frames
            }
            disappear = true; //disparait apres choc avec un monstre
        }
    }

    private void collisionsObstacles(){
        for (Obstacle obs : Jeu.getObstacleTable()){
            if (HitBox.collision(this.hitBox, obs.getHitbox()))disappear = true;
        }
    }

    private void evolveKunai(){
        deplacement();
        updateHitBox();
        collisionsObstacles();
        for (Monster monster : getMonsterList()){
            dealsDamage(monster);
            if (disappear)break; //si le kunai a disparu on arrete de regarder les autres monstres

        }
        if (Math.abs(coordInit.getX()-coord.getX()) >= 500) disappear = true; //au bout d'une certaine distance parcourue, il disparait
    }

    public static void evolveAllKunais(List<Kunai> liste){
        for (Kunai kunai : liste){
            kunai.evolveKunai();
        }
        int k = 0;
        while (k < liste.size()){ //on supprime les kunais utilises
            if (liste.get(k).disappear) liste.remove(liste.get(k));
            else k++;
        }
    }

    public Coordonnees getCoord() {
        return coord;
    }

    public HitBox getHitBox() {
        return hitBox;
    }

    public static int getHeight() {
        return height;
    }

    public static int getWidth() {
        return width;
    }

    public String getSprite() {
        return sprite;
    }
    

}
