import { ENTITE_NONINCARNE } from "../constants.js";
import { DialogSelect } from "../dialog-select.js";

export class Targets {
  static listTargets() {
    return Array.from(game.user.targets);
  }

  static hasTargets() {
    return Targets.listTargets().length > 0;
  }

  static getTokenData( actor, tokenId, target = undefined) {
    if ( target){
      return Targets.extractTokenData(target)
    }
    const token = canvas?.tokens?.get(tokenId);
    return token == undefined
      ? Targets.buildActorTokenData(tokenId, actor)
      : Targets.extractTokenData(token);
  }

  static extractTokenData(target) {
    return {
      id: target?.id,
      name: target?.document.name,
      img: target?.document.texture.src ?? target?.actor.img ?? 'icons/svg/mystery-man.svg'
    }  
  }  


  static extractActorData(actor) {
    return {
      id: actor.id,
      name: actor.prototypeToken?.name ?? actor.name,
      img: actor.prototypeToken?.texture.src ?? actor.img ?? 'icons/svg/mystery-man.svg'
    }
  }

  static buildActorTokenData(tokenId, actor) {
    return { id: tokenId, name: actor?.name?? "pas d'acteur", img: actor?.img ?? 'icons/svg/mystery-man.svg' };
  }

  static isTargetEntite(target) {
    return target?.actor.type == 'entite' && target?.actor.system.definition.typeentite == ENTITE_NONINCARNE;
  }

  static async selectOneTargetToken(onSelectTarget = target => { }) {
    const targets = Targets.listTargets()
    switch (targets.length) {
      case 0:
        return
      case 1:
        onSelectTarget(targets[0])
        return
      default:
        {
          const selectData = {
            title: "Choisir une cible",
            label: "Choisir une seule des cibles",
            list: targets.map(it => Targets.extractTokenData(it))
          };
          DialogSelect.select(selectData, target => onSelectTarget(targets.find(it => it.id == target.id)))
        }
    }
  }

  static getTarget(options = { warn: true }) {
    const targets = Targets.listTargets();
    switch (targets.length) {
      case 1:
        return targets[0];
      case 0:
        if (options.warn) ui.notifications.warn("Vous devez choisir une cible à attaquer!");
        break;
      default:
        if (options.warn) ui.notifications.warn("Vous devez choisir une cible (et <strong>une seule</strong>) à attaquer!");
    }
    return undefined;
  }

}