import { clone } from './functions/util.js';
import { checkCondition, extractMaxTriggers } from './functions/condition.js';

class Talent {
    constructor() {}

    #talents;

    // 初始化传参数去掉{}
    initial(talents) {
        this.#talents = talents;
        for(const id in talents) {
            const talent = talents[id];
            talent.id= Number(id);
            talent.grade = Number(talent.grade);
            talent.max_triggers = extractMaxTriggers(talent.condition);
        }
    }

    check(talentId, property) {
        const { condition } = this.get(talentId);
        return checkCondition(property, condition);
    }

  get(talentId) {
    // console.log('talent.js get',talentId,this.#talents)
    var talent 
    this.#talents.forEach(function(item){
      if (item._id == talentId) {
        talent = item
      }
    })
    if(!talent) throw new Error(`[ERROR] No Talent[${talentId}]`);
    return clone(talent);
  }

  information(talentId) {
      const { grade, name, description } = this.get(talentId)
      return { grade, name, description };
  }

  exclusive(talends, exclusiveId) {
      const { exclusive } = this.get(exclusiveId);
      if(!exclusive) return null;
      for(const talent of talends) {
          for(const e of exclusive) {
              if(talent == e) return talent;
          }
      }
      return null;
  }

  talentRandom(include) {
      // 1000, 100, 10, 1
      const talentList = {};
      for(const talentId in this.#talents) {
          const { id, grade, name, description } = this.#talents[talentId];
          if(id == include) {
              include = { grade, name, description, id };
              continue;
          }
          if(!talentList[grade]) talentList[grade] = [{ grade, name, description, id }];
          else talentList[grade].push({ grade, name, description, id });
      }

      return new Array(10)
          .fill(1).map((v, i)=>{
              if(!i && include) return include;
              const gradeRandom = Math.random();
              let grade;
              if(gradeRandom>=0.111) grade = 0;
              else if(gradeRandom>=0.011) grade = 1;
              else if(gradeRandom>=0.001) grade = 2;
              else grade = 3;

              while(talentList[grade].length == 0) grade--;

              const length = talentList[grade].length;

              const random = Math.floor(Math.random()*length) % length;
              return talentList[grade].splice(random,1)[0];
          });
  }

  allocationAddition(talents) {
      if(Array.isArray(talents)) {
          let addition = 0;
          for(const talent of talents)
              addition += this.allocationAddition(talent);
          return addition;
      }
      return Number(this.get(talents).status) || 0;
  }

  do(talentId, property) {
      const { effect, condition, grade, name, description } = this.get(talentId);
      if(condition && !checkCondition(property, condition))
          return null;
      return { effect, grade, name, description };
  }
}

export default Talent;