class Boss {
  
  int pv, pv_baseboss;
  boolean invincible = false;
  float boss_time;
  boolean boss_d_ou_g = false; 
  int boss_vitesse, default_bosvit;
  float boss_cooldown = 5;
  boolean collision_laser = false;
  PImage visu_boss; 
  int y;
  int x; //égale à ancien "boss_bouge"
  boolean show = true;
  int NUMEROXEPLO = 0;
  int deta_time;
  int time_inv_boss, invisi_time = 2000; // temps de d'invincibilité en millisecondes (2 secondes)
  int time_cligno_boss, deta_cligno_time = 150; // temps de clignotage en millisecondes
  //jauge des pv du boss
  int H_jpv = 25, W_jpv = 650, x_jpv, y_jpv = 20;
  int largeur_bar_vie_T = W_jpv;
  int largeur_bar_vie_cible = W_jpv;
  //laser
  int Xa, Xb, Xc, Ya, Yb, Yc, Xd, Yd, Xe, Ye;
  float ABC, DBC, ACB, DCB, EBC, ECB;
  int boss_stop = 4;
  boolean son_Laser = false, clignote = false;

  
  Boss (int pvboss, String visuboss, int start_x, int start_y, int vitboss){
    boss_vitesse = default_bosvit = vitboss;
    x = start_x;
    y = start_y;
    pv = pv_baseboss = pvboss;
    boss_time = millis()/1000;
    visu_boss = loadImage("data/images/" + visuboss);
         
  }
  
  void BarDeVieBoss(){
   
    //largeur en pixels en fonction des pv courants du boss
    largeur_bar_vie_cible = W_jpv * pv / pv_baseboss;
    //println ("T : " + largeur_bar_vie_T + "    C : " + largeur_bar_vie_cible);
    
    //calcul delai en miliseconds pour chaque pixels a supprimer de la bars de vie en fonction du temps d'invincibilité du boss
    // temps / pixels a suprimmer de la barre :
    //deta_time = invisi_time / (W_jpv - (W_jpv * pv / pv_baseboss));
    //println("pv : " + pv + "  ::   invincible : " + invincible+ "  ::   deta_time : " + deta_time);
     
    //jauge des pv du boss
    x_jpv = width/2-W_jpv/2;
    fill(255, 255, 255, 40);
    noStroke();
    rect(x_jpv, y_jpv, W_jpv, H_jpv, H_jpv / 2);
    fill(#AE0202, 230);
    noStroke();
    rect(  
          x_jpv + (W_jpv - largeur_bar_vie_T)/2, // coordonnées X de la bar de vie 
          y_jpv, // coordonnées Y de la bar de vie 
          largeur_bar_vie_T,
          H_jpv, // hauteur de la bar de vie
          H_jpv / 2 // pour arrondir les angles de la bar de vie du boss
        );
    fill(255);
    textSize(H_jpv / 1.5);
    textAlign(CENTER, CENTER);
    text(pv + " / " + pv_baseboss , x_jpv + W_jpv / 2    , y_jpv + H_jpv /2);
    textAlign(LEFT, BOTTOM);
    textSize(12);
    strokeWeight(2);
    stroke(#ffffff);
    
    noFill();
    rect(x_jpv, y_jpv, W_jpv, H_jpv, H_jpv / 2);  
    fill(255, 255, 255);
    strokeWeight(1);
    stroke(#000000);
  }
  
  void verifiercollisions(){
    
    //vérifie s'il y a une collisions avec le vaisseau
    if ( dist(ship.x, ship.y, x, y) < 200 && show) { 
      ship.collision = true;
    }
    
    //println("pv : " + pv);
    
    //vérifie les collisions du missile du notre vaisseau sur le boss
    if ( dist(xm, ym, x, y) < 114 && !invincible && show){
        //invincible = true;
        clignote = false;
        pv = pv - 1;
        sonCollision.play();
        if (pv > 0) {
          time_inv_boss = millis() + invisi_time;
          invincible = true;
        } else {
          show = false;
        }       
        //Suppression du missile
        lancermisile = false; //a voir pour faire une classe pour le missile du ship
     }
     
     //vérification de la collision avec le laser du boss
     if(boss_vitesse == 0){
        //coordonnées base du vaisseau:
        Xd = ship.x - 100;
        Yd = ship.y + 100;
        
        Xe = ship.x + 100;
        Ye = Yd;
        
        //calcul des angles
        ABC = acos( ( ((Xc-Xb)*(Xa-Xb)) + ((Yc-Yb)*(Ya-Yb)) )/( sqrt(sq(Xc-Xb)+sq(Yc-Yb)) * sqrt(sq(Xa-Xb)+sq(Ya-Yb)) ) );
        ACB = ABC;
        //println("ABC : "+ ABC); 
        //DBC = acos( ( ((Xc-Xb)*(Xd-Xb)) + ((Yc-Yb)*(Yd-Yb)) )/( sqrt(sq(Xc-Xb)+sq(Yc-Yb)) * sqrt(sq(Xd-Xb)+sq(Yd-Yb)) ) );
        DCB = acos( ( ((Xb-Xc)*(Xd-Xc)) + ((Yb-Yc)*(Yd-Yc)) )/( sqrt(sq(Xb-Xc)+sq(Yb-Yc)) * sqrt(sq(Xd-Xc)+sq(Yd-Yc)) ) );
        EBC = acos( ( ((Xc-Xb)*(Xe-Xb)) + ((Yc-Yb)*(Ye-Yb)) )/( sqrt(sq(Xc-Xb)+sq(Yc-Yb)) * sqrt(sq(Xe-Xb)+sq(Ye-Yb)) ) );
        //println("DCB : "+ DCB + " /  EBC : "+ EBC);
        
        stroke(204, 102, 0);
        strokeWeight(4);
        line(Xd, Yd, Xe, Ye);
        //println("Ye, Xe : " + Ye + " <> " + Xe);
        //println("Xd, Yd : " + Xd + " <> " + Yd);
  
        //test collisions avec le laser:
        if (EBC > ABC || ACB < DCB) {
          collision_laser = false;
          //println("collision laser: " + collision_laser);
        } else { 
          collision_laser = true;
          ship.collision = true;
          //println("collision laser: " + collision_laser);
        }       
     }
 
  }
  
  void bouge_boss(){
    
    //gestion du laser
    if (boss_time + boss_cooldown < millis()/1000 && !invincible && pv > 0) {
      boss_vitesse = 0;
      image(laserboss1, x, 380 + y);
      //joue le son du laser une seul fois
      if(!son_Laser){
        son_Laser = true;
        sonLaser_boss.play();
      }
      //calcul dimension laser:
      //coordonnées point haut
      Xa = x;
      Ya = -100 + y;
      
      Xb = x - 566;
      Yb = -100 + y + 981;
      
      Xc = x + 566;
      Yc = Yb;
        
      //triangle(Xa, Ya, Xb, Yb, Xc, Yc);
      
      // boucle fin d'attaque
      if (boss_time + boss_cooldown + boss_stop  < millis()/1000){
        boss_cooldown = random(1, 7);
        boss_vitesse = default_bosvit++;
        //default_bosvit += 1;
        boss_time = millis()/1000;
        son_Laser = false;  
      }
      
      //println("boss_time + boss_cooldown + boss_stop : "+ boss_time + boss_cooldown + boss_stop);
    }
    
    if (boss_d_ou_g == true){ //si le boss vas vers la gauche
      if (x > 100){ //si le boss il n'est pas tout a gauche
        x -= boss_vitesse; //on le fais aller a gauche
      } else { //sinon
        boss_d_ou_g = false; //on lui dit d'aller a gauche
      }
    }
    
    if (boss_d_ou_g == false && x < width-100){
      x += boss_vitesse;
    } else {
      boss_d_ou_g = true;
    }

  }
  
  void apparaitre(){

//println("invincible : " + invincible + "  ::   time_inv_boss : " + time_inv_boss + "  ::   millis() : " + millis()  );
    
    // invincibileté :
    if (invincible && time_inv_boss > millis()) {
      //time_inv_boss = millis();
      invincible = true;
    } else {
      clignote = invincible = false;
    }
    
    if (largeur_bar_vie_T > largeur_bar_vie_cible){
      largeur_bar_vie_T -- ;
    } 
    
    // clignotement :
    if (invincible && time_cligno_boss + deta_cligno_time <= millis()) {
      time_cligno_boss = millis();
      clignote = !clignote;
    }
    

    //affiche l'anime de explosion : 
    if ( !show && NUMEROXEPLO<50 ) {        
      // Ou Methode avec un if :
      if ( String.valueOf(NUMEROXEPLO).length()==1 ) visu_boss = loadImage("data/images/explosion/explosion000"+NUMEROXEPLO+".png");
      else visu_boss = loadImage("data/images/explosion/explosion00"+NUMEROXEPLO+".png");
      NUMEROXEPLO += 1;
    }
    
    if (NUMEROXEPLO == 1 && son) sonExposion.play();
           
    //Affiche le ship ou explosion s'il n'est pas détruis (l'anime de explosion est pas finie)
    if (NUMEROXEPLO < 50 && !clignote) image(visu_boss, x, y);
    //println("boss ..");
  

  }
 
  void affiche_et_mets_a_jour_le_boss(){
    BarDeVieBoss();
    verifiercollisions();
    bouge_boss();
    apparaitre();  
    
  }
  
}
