/**
 * Extend the base Dialog entity by defining a custom window to perform roll.
 * @extends {Dialog}
 */

export class RdDRollDialog extends Dialog {
  
  /* -------------------------------------------- */  
  constructor(mode, html, rollData, actor) {
    let myButtons = { rollButton: {
                        label: "Lancer",
                        callback: html => this.performRollSort(html, false)
                     } };
    if (mode == "sort") {
      myButtons['reserveButton'] = { label: "Mettre en reserve",
                                   callback: html => this.performRollSort(html, true)
                                 }
    }
    
    // Common conf
    let dialogConf = {          
      content: html,
      buttons: myButtons,
      default: "rollButton"
    }
    let dialogOptions = { classes: [ "rdddialog"] } 
    
    // Select proper roll dialog template and stuff
    if (mode == "competence" ) {
      dialogConf.title = "Test de compétence",
      dialogOptions.width =  600;
      dialogOptions.height = 360;
    } else if (mode == "arme") {
      dialogConf.title = "Test de combat/arme",
      dialogOptions.width =  600;
      dialogOptions.height = 360;
    } else if (mode == "carac") {
      dialogConf.title = "Test de caractéristique",
      dialogOptions.width =  600;
      dialogOptions.height = 320;
    } else if (mode == "sort") {
      dialogConf.title = "Lancer un sort",
      dialogOptions.width =  600;
      dialogOptions.height = 380;
    }
    super(dialogConf, dialogOptions);

    this.mode     = mode;
    this.rollData = rollData; 
    this.actor    = actor;    
  } 

  /* -------------------------------------------- */  
  performRollSort (html, isReserve=false) {
    this.rollData.isSortReserve = isReserve;
    this.actor.performRoll( this.rollData );
  }

  /* -------------------------------------------- */  
	activateListeners(html) {
    super.activateListeners(html);
    
    // Get the rollData stuff
    var rollData = this.rollData;  
      
    function updateRollResult( rollData ) {
      if ( rollData.competence ) 
        rollData.finalLevel = parseInt(rollData.competence.data.niveau) + parseInt(rollData.bmValue) + parseInt(rollData.etat);
      else if ( rollData.draconicList ) 
        rollData.finalLevel = parseInt(rollData.selectedDraconic.data.niveau) + parseInt(rollData.selectedSort.data.difficulte) + parseInt(rollData.etat);
      else 
        rollData.finalLevel = parseInt(rollData.bmValue) + parseInt(rollData.etat);
      
      rollData.finalLevelStr = (rollData.finalLevel >= 0 ) ? "+" + rollData.finalLevel : rollData.finalLevel;
      $("#roll-param").text( rollData.selectedCarac.value + " / " +  rollData.finalLevelStr );
      rollData.rollTarget = game.data.RdDUtility.getResolutionField( rollData.selectedCarac.value, rollData.finalLevel);  

      let armeTitle = ( rollData.arme ) ? " ("+rollData.arme.name+") " : ""; // If a weapon is there, add it in the title
      let niveauStr = "";
      if ( rollData.competence ) { 
        niveauStr = (rollData.competence.data.niveau >= 0) ? "+" + rollData.competence.data.niveau : rollData.competence.data.niveau;
        $("#compdialogTitle").text( rollData.selectedCarac.label + "/" + rollData.competence.name + armeTitle + " " + niveauStr ); 
      } else if ( rollData.draconicList) {
        $("#compdialogTitle").text( rollData.selectedDraconic.name + " - " + rollData.selectedSort.name );
      } else {
        $("#compdialogTitle").text( rollData.selectedCarac.label ); 
      }
      $(".table-resolution").remove();
      game.data.RdDUtility.makeHTMLResolutionTable( $("#resolutionTable"), rollData.selectedCarac.value-2, parseInt(rollData.selectedCarac.value) + 2, -10, 11, 
          rollData.selectedCarac.value, rollData.finalLevel );
    }
  
    // Setup everything onload
    $(function() {
      // Update html, according to data
      if (rollData.competence) {
        // Set the default carac from the competence item
        console.log(rollData.competence.data.defaut_carac, rollData.carac);
        rollData.selectedCarac = rollData.carac[rollData.competence.data.defaut_carac];
        $("#carac").val( rollData.competence.data.defaut_carac ); 
      }
      $("#bonusmalus").val( rollData.bmValue ); 
      updateRollResult(rollData);
    });
            
    // Update !
    html.find('#bonusmalus').click((event) => {    
      rollData.bmValue = event.currentTarget.value; // Update the selected bonus/malus
      //console.log("BM CLICKED !!!", rollData.bmValue, rollData.competence.data.niveau, parseInt(rollData.competence.data.niveau) + parseInt(rollData.bmValue) );
      updateRollResult(rollData);
    });
    html.find('#carac').click((event) => {    
      let caracKey = event.currentTarget.value;        
      rollData.selectedCarac = rollData.carac[caracKey]; // Update the selectedCarac
      //console.log("CARAC CLICKED !!!", rollData.selectedCarac, rollData.competence.data.niveau, rollData.bmValue);
      updateRollResult(rollData);
    });        
    html.find('#draconic').click((event) => {    
      let draconicKey = event.currentTarget.value;        
      rollData.selectedDraconic = rollData.draconicList[draconicKey]; // Update the selectedCarac
      //console.log("CARAC CLICKED !!!", rollData.selectedCarac, rollData.competence.data.niveau, rollData.bmValue);
      updateRollResult(rollData);
    });        
    html.find('#sort').click((event) => {    
      let sortKey = event.currentTarget.value;        
      rollData.selectedSort = rollData.sortList[sortKey]; // Update the selectedCarac
      //console.log("CARAC CLICKED !!!", rollData.selectedCarac, rollData.competence.data.niveau, rollData.bmValue);
      updateRollResult(rollData);
    });        
  }

}
