const ArtifactSubAttrsRaw = `101021: 生命值+24
101022: 生命值+30
201021: 生命值+50
201022: 生命值+61
201023: 生命值+72
301021: 生命值+100
301022: 生命值+115
301023: 生命值+129
301024: 生命值+143
401021: 生命值+167
401022: 生命值+191
401023: 生命值+215
401024: 生命值+239
501021: 生命值+209
501022: 生命值+239
501023: 生命值+269
501024: 生命值+299
101031: 生命值百分比+1.2%
101032: 生命值百分比+1.5%
201031: 生命值百分比+1.6%
201032: 生命值百分比+2.0%
201033: 生命值百分比+2.3%
301031: 生命值百分比+2.4%
301032: 生命值百分比+2.8%
301033: 生命值百分比+3.2%
301034: 生命值百分比+3.5%
401031: 生命值百分比+3.3%
401032: 生命值百分比+3.7%
401033: 生命值百分比+4.2%
401034: 生命值百分比+4.7%
501031: 生命值百分比+4.1%
501032: 生命值百分比+4.7%
501033: 生命值百分比+5.2%
501034: 生命值百分比+5.8%
101051: 攻击力+2
101052: 攻击力+2
201051: 攻击力+3
201052: 攻击力+4
201053: 攻击力+5
301051: 攻击力+7
301052: 攻击力+7
301053: 攻击力+8
301054: 攻击力+9
401051: 攻击力+11
401052: 攻击力+12
401053: 攻击力+14
401054: 攻击力+16
501051: 攻击力+14
501052: 攻击力+16
501053: 攻击力+18
501054: 攻击力+19
101061: 攻击力百分比+1.2%
101062: 攻击力百分比+1.5%
201061: 攻击力百分比+1.6%
201062: 攻击力百分比+2.0%
201063: 攻击力百分比+2.3%
301061: 攻击力百分比+2.4%
301062: 攻击力百分比+2.8%
301063: 攻击力百分比+3.2%
301064: 攻击力百分比+3.5%
401061: 攻击力百分比+3.3%
401062: 攻击力百分比+3.7%
401063: 攻击力百分比+4.2%
401064: 攻击力百分比+4.7%
501061: 攻击力百分比+4.1%
501062: 攻击力百分比+4.7%
501063: 攻击力百分比+5.2%
501064: 攻击力百分比+5.8%
101081: 防御力+2
101082: 防御力+2
201081: 防御力+4
201082: 防御力+5
201083: 防御力+6
301081: 防御力+8
301082: 防御力+9
301083: 防御力+10
301084: 防御力+11
401081: 防御力+13
401082: 防御力+15
401083: 防御力+17
401084: 防御力+19
501081: 防御力+16
501082: 防御力+19
501083: 防御力+21
501084: 防御力+23
101091: 防御力百分比+1.5%
101092: 防御力百分比+1.8%
201091: 防御力百分比+2.0%
201092: 防御力百分比+2.5%
201093: 防御力百分比+2.9%
301091: 防御力百分比+3.1%
301092: 防御力百分比+3.5%
301093: 防御力百分比+3.9%
301094: 防御力百分比+4.4%
401091: 防御力百分比+4.1%
401092: 防御力百分比+4.7%
401093: 防御力百分比+5.2%
401094: 防御力百分比+5.8%
501091: 防御力百分比+5.1%
501092: 防御力百分比+5.8%
501093: 防御力百分比+6.6%
501094: 防御力百分比+7.3%
101231: 元素充能效率+1.3%
101232: 元素充能效率+1.6%
201231: 元素充能效率+1.8%
201232: 元素充能效率+2.2%
201233: 元素充能效率+2.6%
301231: 元素充能效率+2.7%
301232: 元素充能效率+3.1%
301233: 元素充能效率+3.5%
301234: 元素充能效率+3.9%
401231: 元素充能效率+3.6%
401232: 元素充能效率+4.1%
401233: 元素充能效率+4.7%
401234: 元素充能效率+5.2%
501231: 元素充能效率+4.5%
501232: 元素充能效率+5.2%
501233: 元素充能效率+5.8%
501234: 元素充能效率+6.5%
101241: 元素精通+5
101242: 元素精通+6
201241: 元素精通+7
201242: 元素精通+8
201243: 元素精通+9
301241: 元素精通+10
301242: 元素精通+11
301243: 元素精通+13
301244: 元素精通+14
401241: 元素精通+13
401242: 元素精通+15
401243: 元素精通+17
401244: 元素精通+19
501241: 元素精通+16
501242: 元素精通+19
501243: 元素精通+21
501244: 元素精通+23
101201: 暴击率+0.8%
101202: 暴击率+1.0%
201201: 暴击率+1.1%
201202: 暴击率+1.3%
201203: 暴击率+1.5%
301201: 暴击率+1.6%
301202: 暴击率+1.9%
301203: 暴击率+2.1%
301204: 暴击率+2.3%
401201: 暴击率+2.2%
401202: 暴击率+2.5%
401203: 暴击率+2.8%
401204: 暴击率+3.1%
501201: 暴击率+2.7%
501202: 暴击率+3.1%
501203: 暴击率+3.5%
501204: 暴击率+3.9%
101221: 暴击伤害+1.5%
101222: 暴击伤害+1.9%
201221: 暴击伤害+2.2%
201222: 暴击伤害+2.6%
201223: 暴击伤害+3.1%
301221: 暴击伤害+3.3%
301222: 暴击伤害+3.7%
301223: 暴击伤害+4.2%
301224: 暴击伤害+4.7%
401221: 暴击伤害+4.3%
401222: 暴击伤害+5.0%
401223: 暴击伤害+5.6%
401224: 暴击伤害+6.2%
501221: 暴击伤害+5.4%
501222: 暴击伤害+6.2%
501223: 暴击伤害+7.0%
501224: 暴击伤害+7.8%`

const SubAttrDefinition = {
  '102': {
    name: '生命值',
    percent: false,
  },
  '103': {
    name: '生命值百分比',
    percent: true,
  },
  '105': {
    name: '攻击力',
    percent: false,
  },
  '106': {
    name: '攻击力百分比',
    percent: true,
  },
  '108': {
    name: '防御力',
    percent: false,
  },
  '109': {
    name: '防御力百分比',
    percent: true,
  },
  '123': {
    name: '元素充能效率',
    percent: true,
  },
  '124': {
    name: '元素精通',
    percent: false,
  },
  '120': {
    name: '暴击率',
    percent: true,
  },
  '122': {
    name: '暴击伤害',
    percent: true,
  }
}

// 5星：初始3-4词条，强化最多5次，最多9个词条，同一个词条出现的最高数量 6 次 （9 - 4 + 1）
// 4星：初始2-3词条，强化最多4次，最多7个词条，同一个词条出现的最高数量 4 次 （7 - 4 + 1）
// 3星：初始1-2词条，强化最多3次，最多5个词条，同一个词条出现的最高数量 2 次 （5 - 4 + 1）
// 2星：初始0-1词条，强化最多1次，最多2个词条，同一个词条出现的最高数量 1 次  (我真的日了狗了，为了测试浪费了点狗粮....谁说star * 4的，害我扔了个4级1星给3级2星，直接给我满了！2星也只能强化到4级！）
// 1星：初始0词条，强化最多1次，最多1个词条，同一个词条出现的最高数量 1 次
const levelUpTimes = {
  5: 6,
  4: 4,
  3: 2,
  2: 1,
  1: 1,
}

// 把某个词条可能存在的情况打表打出来
const genSubAttrsValueTable = (children, isPercent, star) => {
  // 圣遗物强化
  const maxDeep = levelUpTimes[star * 1];
  const ret = []
  for (let i = 1; i <= maxDeep; i++) { // 最大强化次数
    const dfs = (items, status, deep) => {
      // if (!ret.find(t => t.value === status.value)) {  // 裁剪掉数值一样的组合，选择困难症患者福音
      //   ret.push(status);
      // }
      // 需要找最优的词条数
      let found = false;
      ret.forEach((t, index) => {
        if (found) return;
        if (t.value === status.value) {
          found = true;
          // 如果找到了对应项
          if (status.codes.length < t.codes.length) {
            console.log(status.value, status.codes.length, t.codes.length);
            ret[index] = status  // 替换
          }
        }
      })
      if (!found && status.value > 0) {
        ret.push(status);  // 没有找到对应数值的时候再填数字进去
      }

      if (deep > i) { // 词条超了就退
        return;
      }
      children.forEach(item => {    // 遍历children
        const nextItems = items.concat([item]);
        const st = {
          value: status.value + item.meta.valueNumber,
          codes: nextItems.map(t => t.value),
        }
        dfs(nextItems, st, deep + 1)
      });
    }
    dfs([], { value: 0, codes: [] }, 1)
  }
  ret.sort((a, b) => a.value < b.value ? -1 : 1)
  return ret.map(item => ({ value: isPercent ? (item.value / 10.0) : item.value, codes: item.codes }));
}

// 生成对应分类的代码表
/*
    {
      1: {     // 品质
        '102': {  // 大分类ID
          id: '102',
          name: '生命值',
          percent: false,
          children: [ { label: '生命值+30', value: '101022', meta: {  } }, { ... } ]，
          valueSet: [ { value: 30, codes: ['101022'] } ]
        },
        '103': { ... },
        ...
      },
      2: {
        ...
      }
    }
 */
const generateCategories = () => {
  const result = {
    1: {},
    2: {},
    3: {},
    4: {},
    5: {},
  }
  for (let i = 1; i <= 5; i++) {
    Object.keys(SubAttrDefinition).forEach(key => {
      const d = SubAttrDefinition[key];
      result[i][key] = {
        id: key,
        name: d.name,
        percent: d.percent,
        children: [],
        valueSet: [],
        valueMax: 0,
      }
    })
  }
  const ArtifactSubAttrsTextList = ArtifactSubAttrsRaw.split('\n');
  ArtifactSubAttrsTextList.forEach(item => {
    const itemSplit = item.split(':');
    const code = itemSplit[0]
    const level = parseInt(code.substring(0, 1), 10);
    const groupCode = code.substring(2, 5);
    const nameLabel = itemSplit[1].trim().split('+')
    const name = nameLabel[0];
    const value = nameLabel[1].replace(/([^\d.]+)/g, '');
    const isPercent = nameLabel[1].indexOf('%') > -1;
    const valueNumber = isPercent ? parseInt(value.replace('.', ''), 10) : parseInt(value, 10);
    // 备注：所有百分比数值都人为放大10倍，以便于计算，防止浮点数精度搞事
    const meta = {
      name,
      value,
      valueNumber,
      group: groupCode,
      percent: isPercent,
    }
    result[level][groupCode].children.push({
      label: itemSplit[1].trim(),
      value: code,
      meta,
    });
  });
  for (let i = 1; i <= 5; i++) {
    Object.keys(SubAttrDefinition).forEach(key => {
      const d = SubAttrDefinition[key];
      result[i][key].valueSet = genSubAttrsValueTable(result[i][key].children, d.percent, i)
      let max = 0;
      result[i][key].valueSet.forEach(item => {
        max = Math.max(max, item.value);
      });
      result[i][key].valueMax = max;
    })
  }

  return result;
}

const fs = require('fs');

fs.writeFile('./artifact_sub_attrs_map.json', JSON.stringify(generateCategories(), null,2), () => {
  console.log('写入完成')
});

