import { appTasks, OhosAppContext, OhosHarContext, OhosPluginId } from '@ohos/hvigor-ohos-plugin';
import { hvigor, getNode } from '@ohos/hvigor';
import { appTasks } from '@ohos/hvigor-ohos-plugin';
import { updateAbcVersionPlugin, updateHarAbcVersionPlugin } from './plugin.ts';
const fs = require('fs');

const LOG_TAG = 'BM_BUILD';

let localParams = null;
const buildInfo = (message, args) => {
    console.info(`${LOG_TAG} ${message}`, args);
}

const buildError = (message, args) => {
    console.error(`${LOG_TAG} ${message}`, args);
}
const parseLocalParams = () => {
    try {
        // 使用 utf8 编码同步读取文件内容
        const data = fs.readFileSync('./local-params.json', 'utf8');
        const obj = JSON.parse(data);
        return obj
    } catch (err) {
        console.info('reading the local params failure');
        return;
    }
}
const getBuildParameter = (key) => {
    return hvigor.getParameter().getExtParam(key) || localParams?.build?.[`${key}`];
}
/**
 * 获取app版本号
 * @param defaultVersionName 默认版本名
 * @param defaultVersionCode 默认版本号
 * @returns
 */
const obtainAppVersion = (defaultVersionName: string, defaultVersionCode: number): { vn: string, vc: number } => {
    // 外部传入的版本号，可能是手动传入的或者从分支名解析出来的，如果没有传入，就使用配置文件默认的版本号
    // const versionName = getBuildParameter('versionName');
    // const versionCode = getBuildParameter('versionCode');
    // if (!versionName) {
    //     return {
    //         vn: defaultVersionName,
    //         vc: defaultVersionCode
    //     }
    // }
    //
    // if (versionCode && !isNaN(parseInt(versionCode)) && +versionCode > 0) {
    //     return {
    //         vn: versionName,
    //         vc: +versionCode
    //     }
    // }
    //
    // return {
    //     vn: versionName,
    //     vc: defaultVersionCode
    // }

    // 暂时手动维护版本号
    return {
        vn: defaultVersionName,
        vc: defaultVersionCode
    }
}
/**
 * 添加自定义参数，支持覆盖build-profile.json5中已定义的参数
 * @returns 要添加进BuildProfile的自定义构建参数
 */
const genProjectBuildProfileFields = (projectName) => {
    const testMode = getBuildParameter('testMode')?.toString();
    return {
        TEST_MODE: testMode === 'true'
    }
}

const genModuleBuildProfileFields = (moduleName) => {
    const testMode = getBuildParameter('testMode')?.toString();
    if (moduleName === 'lib_utils') {
        const appLog = getBuildParameter('appLog')?.toString();
        return {
            TEST_MODE: testMode === 'true',
            APP_LOG: testMode === 'true' && appLog === 'true'
        }
    }
    return;
}

// 给har模块添加自定义参数
hvigor.afterNodeEvaluate((node) => {
    const harContext = node.getContext(OhosPluginId.OHOS_HAR_PLUGIN) as OhosHarContext;
    if (harContext) {

        const moduleName = harContext.getModuleName();
        const buildProfileOpt = harContext.getBuildProfileOpt();
        if (!buildProfileOpt.buildOption.arkOptions) {
            buildProfileOpt.buildOption.arkOptions = {};
        }
        buildProfileOpt.buildOption.arkOptions.buildProfileFields =
            Object.assign(buildProfileOpt.buildOption.arkOptions.buildProfileFields || {}, genModuleBuildProfileFields(moduleName));
        // 注入结果写回
        harContext.setBuildProfileOpt(buildProfileOpt);
    }
});

// 给App模块添加自定义参数
hvigor.getRootNode().afterNodeEvaluate(rootNode => {
    const appContext = rootNode.getContext(OhosPluginId.OHOS_APP_PLUGIN) as OhosAppContext;
    localParams = parseLocalParams();
    /**
     * 1.修改版本号，本地修改版本号可以通过修改app.json5中的versionName、versionCode实现
     * 2.增加testMode变量，在release包控制“测”字、BMLog输出
     */
    const appJsonOpt = appContext.getAppJsonOpt();
    const versionConfig = obtainAppVersion(appJsonOpt['app']['versionName'], appJsonOpt['app']['versionCode']);
    buildInfo('BM_BUILD 构建版本信息', versionConfig);
    const buildProfileOpt = appContext.getBuildProfileOpt();
    buildProfileOpt['app']['products'].forEach(item => {
        // 覆盖build_profile，确保使用外部传入的版本号
        item.versionCode = versionConfig.vc;
        item.versionName = versionConfig.vn;

        // 添加自定义参数
        if (!item.buildOption.arkOptions) {
            item.buildOption.arkOptions = {};
        }
        item.buildOption.arkOptions.buildProfileFields =
            Object.assign(item.buildOption.arkOptions.buildProfileFields || {}, genProjectBuildProfileFields(item.name));
        buildInfo(`product:${item.name} 构建参数`, item.buildOption.arkOptions.buildProfileFields);
    });

    // 写回修改结果
    appContext.setBuildProfileOpt(buildProfileOpt);
})

export default {
    system: appTasks,  /* Built-in plugin of Hvigor. It cannot be modified. */
    plugins:[updateAbcVersionPlugin(), updateHarAbcVersionPlugin()]
}