import fs from 'fs/promises';

(async function () {
    // 1. 声明道具
    const item = await fs.readFile('./public/project/items.js', 'utf-8');
    const itemData = JSON.parse(item.split('\n').slice(1).join('')) as any;

    let itemDec = 'interface ItemDeclaration {\n';
    for (const id in itemData) {
        itemDec += `    ${id}: '${itemData[id].cls}';\n`;
    }
    itemDec += '}';

    // 2. 声明公共事件
    const event = await fs.readFile('./public/project/events.js', 'utf-8');
    const eventData = JSON.parse(event.split('\n').slice(1).join('')) as any;

    let eventDec = 'type EventDeclaration = \n';
    for (const id in eventData.commonEvent) {
        eventDec += `    | '${id}'\n`;
    }

    // 3. 声明数字id映射与cls映射
    const map = await fs.readFile('./public/project/maps.js', 'utf-8');
    const mapData = JSON.parse(map.split('\n').slice(1).join('')) as any;

    let id2num = 'interface IdToNumber {\n';
    let num2id = 'interface NumberToId {\n';
    let id2cls = 'interface IdToCls {\n';
    for (const num in mapData) {
        const { id, cls } = mapData[num];
        id2num += `    ${id}: ${num};\n`;
        num2id += `    ${num}: '${id}';\n`;
        id2cls += `    ${id}: '${cls}';\n`;
    }
    id2cls += '}';
    id2num += '}';
    num2id += '}';

    // 4. 声明楼层id,图片,动画,音效,文件别名,背景音乐,字体
    const data = await fs.readFile('./public/project/data.js', 'utf-8');
    const d = (JSON.parse(data.split('\n').slice(1).join('')) as any).main;

    let floorId = 'type FloorIds =\n';
    let imgs = 'type ImageIds =\n';
    let anis = 'type AnimationIds =\n';
    let sounds = 'type SoundIds =\n';
    let names = 'interface NameMap {\n';
    let bgms = 'type BgmIds =\n';
    let fonts = 'type FontIds =\n';

    floorId += d.floorIds.map((v: string) => `    | '${v}'\n`).join('');
    imgs += d.images.map((v: string) => `    | '${v}'\n`).join('');
    anis += d.animates.map((v: string) => `    | '${v}'\n`).join('');
    sounds += d.sounds.map((v: string) => `    | '${v}'\n`).join('');
    bgms += d.bgms.map((v: string) => `    | '${v}'\n`).join('');
    fonts += d.fonts.map((v: string) => `    | '${v}'\n`).join('');
    for (const name in d.nameMap) {
        names += `    '${name}': '${d.nameMap[name]}';\n`;
    }
    names += '}';

    // 5. 写入文件
    await fs.writeFile('./src/source/cls.d.ts', id2cls, 'utf-8');
    await fs.writeFile('./src/source/events.d.ts', eventDec, 'utf-8');
    await fs.writeFile('./src/source/items.d.ts', itemDec, 'utf-8');
    await fs.writeFile(
        './src/source/maps.d.ts',
        `${id2num}\n${num2id}`,
        'utf-8'
    );
    await fs.writeFile(
        './src/source/data.d.ts',
        `
${floorId}
${d.images.length > 0 ? imgs : 'type ImageIds = never\n'}
${d.animates.length > 0 ? anis : 'type AnimationIds = never\n'}
${d.sounds.length > 0 ? sounds : 'type SoundIds = never\n'}
${d.bgms.length > 0 ? bgms : 'type BgmIds = never\n'}
${d.fonts.length > 0 ? fonts : 'type FontIds = never\n'}
${names}
`,
        'utf-8'
    );
})();