import { readFileSync } from 'fs';
import { join } from 'path';
import { resolvePkg } from '@fesjs/utils';
import { getLocalesJSON } from './utils';

const namespace = 'plugin-locale';

export default (api) => {
    const {
        utils: { Mustache }
    } = api;

    api.describe({
        key: 'locale',
        config: {
            schema(joi) {
                return joi.object();
            },
            default: {},
            onChange: api.ConfigChangeType.regenerateTmpFiles
        }
    });

    api.addRuntimePluginKey(() => 'locale');

    const absoluteFilePath = join(namespace, 'core.js');

    const absRuntimeFilePath = join(namespace, 'runtime.js');

    function getLocaleFileBasePath() {
        return join(
            api.paths.absSrcPath,
            api.config.singular ? 'locale' : 'locales'
        );
    }

    // 监听 locale 文件改变，重新生成文件
    api.addTmpGenerateWatcherPaths(getLocaleFileBasePath);

    api.onGenerateFiles(() => {
        // .fes配置
        const userConfig = {
            locale: 'zh-CN', // default locale
            fallbackLocale: 'zh-CN', // set fallback locale
            legacy: false,
            baseNavigator: true, // 开启浏览器语言检测
            ...api.config.locale
        };

        const localeConfigFileBasePath = getLocaleFileBasePath();

        const locales = getLocalesJSON(localeConfigFileBasePath);

        const { baseNavigator, ...otherConfig } = userConfig;

        api.writeTmpFile({
            path: absoluteFilePath,
            content: Mustache.render(
                readFileSync(join(__dirname, 'runtime/core.tpl'), 'utf-8'),
                {
                    REPLACE_LOCALES: locales,
                    REPLACE_DEFAULT_OPTIONS: JSON.stringify(
                        otherConfig,
                        null,
                        2
                    ),
                    BASE_NAVIGATOR: baseNavigator,
                    VUE_I18N_PATH: resolvePkg('vue-i18n')
                }
            )
        });

        api.copyTmpFiles({
            namespace,
            path: join(__dirname, 'runtime'),
            ignore: ['.tpl']
        });
    });

    api.addPluginExports(() => [
        {
            specifiers: ['useI18n', 'locale'],
            source: absoluteFilePath
        }
    ]);

    api.addRuntimePlugin(() => `@@/${absRuntimeFilePath}`);
};
