/* Hint & Description construction stuffs */

/******************** Hint builders ********************/

cgevent.HINT_PARTS1 = ['prerequisite','requirement'];
cgevent.HINT_PARTS2 = ['trigger',
             '', 'miss','effect', 'sustain', 'remote',
             '2', 'miss2','effect2',
             '3', 'miss3','effect3',
             'weapon', 'special'];

/**
 * Build the hint of a feature, feat, power, or equipment
 * @subject Either object or prototype
 */
cgevent.generateHint = function(subject) {
  if (subject._type == 'equipment')
    return this.generateEqipmentDesc(subject, 'desc');
  else
    return this.generateFFPEHint(subject, 'desc');
};

/* Eq desc builder */
cgevent.generateEqipmentDesc = function(subject) {
  var text = window.text;
  var result = subject.hint || '';
  let right = '';
  let rules = subject.rules;
  let title = rules.title.getDesc(subject);
  if (!result) {
//    let flav = rules.flav && rules.flav.getDesc(subject);
    let desc = rules.desc && rules.desc.getDesc(subject);
    let hand = subject.hand ? subject.hand : 0;

    if (subject.property && subject.property.versatile)
      hand = text['weapon_versatile'];
    else
      if (subject.hand) hand = text['hand_' + hand + '_handed'];
    if (title) result += '<br><b>' + title + '</b>';
    if (hand) result += ' &nbsp; ' + hand;
    if (subject.classes && typeof subject.classes == 'object')
      result += ' ' + chargen.System.textualise('weapon_', [type for each ([type,t] in Iterator(subject.classes))].slice(2)).join(' ');

//    if (flav) result += '<br><i>' + flav + '</i>';
    if (subject.ac) result += '<br><b>' + text.hint_part_ac + '</b>: ' + chargen.System.modifier(subject.ac);
    if (subject.damage) result += '<br><b>' + text.hint_part_damage + '</b>: ' + subject.damage;
    if (subject.normalrange) result += '<br><b>' + text.hint_part_range + '</b>: ' + subject.normalrange+'/'+subject.longrange;

    if (desc) result += '<br>' + desc;
    if (result) result = result.substring(4); // removes br
  } else {
    if (title) result = '<b>'+title+'</b>'+result;
  }
  if (subject.property && typeof subject.classes == 'object') {
    if (subject.proficiency) right += chargen.System.modifier(subject.proficiency) + ' ';
    right += chargen.System.textualise('weapon_', [type for each ([type,t] in Iterator(subject.property))]).join(' ');
  }
  if (subject.book) result = "<div class='a_right f_right'>"+text['book_'+subject.book]+'<br>'+right+"</div>" + result;
  return result;
};


/* Desc builder, used in hint generation */
cgevent.generateFFPEHint = function(subject, type) {
  var text = window.text;
  var result = subject.hint || '';
  let right = '';
  let txt = subject.text;
  let rules = subject.rules;
  let title = rules.title.getDesc(subject);
  if (!result) {
//    let flav = rules.flav && rules.flav.getDesc(subject);
    let desc = rules.desc && rules.desc.getDesc(subject);
    if (title) {
      result += '<br><b';
      let colour = (subject.type == 'utility' && subject.frequency) ? ( subject.frequency == 'encounter' ? 'darkred' : (subject.frequency == 'atwill' ? 'darkgreen' : null ) ) : null;
      if (colour) result += ' style="color:'+colour+'"';
      result += '>'+title+'</b>';
    }
//    if (flav) result += '<br><i>' + flav + '</i>';
    for each (let part in this.HINT_PARTS1) {
      let t = (rules[part] && rules[part].getDesc(subject)) || '';
      if (t) {
        result += '<br><b>'+text['hint_part_'+part]+'</b>: ';
        result += t;
      }
    }
    if (desc) result += '<br>' + desc;
    for each (let part in this.HINT_PARTS2) {
      if (!part || +part == part) {
        // Attack & hit damage
        let temp = ''
        temp = subject.tar ? subject.tar(part) : '';
        if (temp) result += '<br><b>' + text['hint_part_target'+part] + '</b>: ' + temp;
        temp = subject.atk ? subject.atk(part) : '';
        if (temp) result += '<br><b>' + text['hint_part_attack'+part] + '</b>: ' + temp;
        temp = subject.hit ? subject.hit(part) : '';
        if (temp) result += '<br><b>' + text['hint_part_hit'+part] + '</b>: ' + temp;
      } else {
        // Other
        let sub = subject[part] || '';
        let t = (rules[part] && rules[part].getDesc(subject)) || txt[part] || '';
        if ((sub && typeof(sub) == 'string') || t) { // Got part, but no rule info
          if (sub && !t && text[part+'_'+sub]) {
            t = text[part+'_'+sub];
            sub = null;
          }
          result += '<br><b>'+text['hint_part_'+part]+'</b>: ';
          if (sub && typeof(sub) == 'string') result += sub;
          if (t) result += t;
        }
      }
    }
    for (let fieldname in subject.rules)
      if (startsWith(fieldname, 'if_')) {
        let [group, feature] = fieldname.slice(3).split('_', 2);
        let rules = chargen.Features[group][feature].prototype.rules;
        result += '<br><b>' + rules.title.getDesc(subject) + '</b>: ' + subject.rules[fieldname].getDesc(subject);
      }

    if (result) result = result.substring(4); // removes br
  } else {
    if (title) result = '<b>'+title+'</b>'+result;
  }
  right = chargen.System.glue(
//          chargen.System.textualise('', subject.power || []).concat(  // We don't really need another power source reminder...
          chargen.System.textualise('accessory_', subject.accessory || []).concat(
          chargen.System.textualise('', subject.effect || []).concat(
          chargen.System.textualise('', subject.energy || [])
                  )), ' ');
  if (subject.book) result = "<div class='a_right f_right'>"+text['book_'+subject.book]+'<br>'+right+"</div>" + result;
  return result;
};

cgevent.slotHint = function() {
  var selection = this.selection;
  if (!selection) return this.raw_hint || null;
  return cgevent.generateHint(selection);
};



/******************** Description builders ********************/

/*
 Build a short summary for given power
 */
cgevent.buildPowerSummary = function(power) {
  let result = '';
  let rules = power.rules;
  var text = window.text;
  // Tags
  if (power.power) for each (let i in power.power) result += text[i]+' ';
  if (power.accessory) for each (let i in power.accessory) result += text['accessory_'+i]+' ';
  if (power.energy) for each (let i in power.energy) result += text[i]+' ';
  if (power.effect) for each (let i in power.effect) result += text[i]+' ';
  if (result) result = '<span class="f_right">'+result+' &nbsp;</span>';

  // Main body
  if (typeof(power.level) == 'string')
    if (power.level == 'feature')
      result += power.owner[0].toUpperCase(); // Should be race_xxx / class_xxx / feat_xxx
    else
      result += 'F';
  else
    result += power.level; // || text['power_'+power.type];
  result += '&nbsp; &nbsp; ';

  if (power.action != 'standard') result += '<u>' + text['action_'+power.action] + '</u>';
  if (power.are) result += ' ' + power.are();
  if (!power.range || power.range != 'personal')
    if (power.target && power.target != 1)
      result += ' <span class="txtxsmall">'+text['target_'+power.target]+'</span>';

  // Attack & damage/effect/summary
  if (rules.attack || rules.defense) result += ' &nbsp; &nbsp; ' + power.atk();
  if (rules.attack2) result += rules.attack3 ? ' ++' : ' +';
  let summary = rules.summary ? rules.summary.getDesc(power) : '';
  if (!summary || summary[0] == '"') {
    // No summary >.<  Find damage or first Number in hit/effect and use it
    let effect = rules.hit_damage || chargen.Rule.getFirstNumber(rules.hit || rules.effect);
    if (effect) result +=  ' &nbsp; &nbsp; ' + effect.getDesc(power).split(' ',2)[0]; // Remove 'bonus', 'damage', etc.
    if (rules.hit_damage2) result += ', ' + rules.hit_damage2.getDesc(power).split(' ',2)[0];
  }
  if (summary)
    if (summary[0] == '"')
      result += summary.slice(1);
    else
      result += ' &nbsp; &nbsp; ' + summary;
  return chargen.Rule.parse(result).getDesc(power);
};


/*
 Build a short summary for given equipment
 */
cgevent.buildEquipmentSummary = function(eq, chr) {
  let result = '';
  var text = window.text;

  if (eq.type == 'armour' || eq.type == 'shield') {
    if (!eq.checkProficiency(chr)) result += '<span class="unproficient">' + text.eq_unproficient + '</span> ';
    result += text.ac + ' +' + eq.ac;
    if (eq.ref) result += ', ' + text.ref + ': +' + eq.ref;
    if (eq.check) result += ' | ' + text.eq_checkPenalty + ': ' + eq.check;

  } else if (eq.type == 'weapon') {
    result += '<div class="f_right">';
    result += text['weapon_'+eq.category];
    result += ' ' + chargen.System.textualise('weapon_', [type for each ([type,t] in Iterator(eq.property)) if (type != 'versatile')]).join(' ');
    result += ' &nbsp;</div>';

    if (!eq.checkProficiency(chr)) result += '<span class="unproficient">' + text.eq_unproficient + '</span> ';
    result += (eq.property.versatile ? text['weapon_versatile'] : text['hand_' + eq.hand + '_handed'] ) + ' ';
    result += chargen.System.textualise('weapon_', [type for each ([type,t] in Iterator(eq.classes)) if (chargen.System.Equipment.list_WeaponGroup.indexOf(type) >= 0)]).join(' ');
    result += ' | '
    result += chargen.System.modifier(eq.proficiency || 0) + ' &nbsp;';
    result += eq.damage;
    if (eq.normalrange) result += ' ' + eq.normalrange + '/' + eq.longrange;

  } else {
    return "TODO";
  }

  return result;//chargen.Rule.parse(result).getDesc(eq);
}
