const vfs = require('vinyl-fs');
const fs = require('fs-extra');
const sort = require('gulp-sort');
const path = require('path');
const scanner = require('i18next-scanner');
const _ = require('lodash');
const { crc32 } = require('crc');

const scannerConfig = {
  input: [
    'services/**/*.{ts,tsx}',
    'plugins/**/*.{ts,tsx}',
    '!src/**/*.spec.{js,jsx,ts,tsx}',
    '!**/node_modules/**',
  ],
  output: './', //输出目录
  options: {
    debug: false,
    sort: true,
    func: false,
    trans: false,
    lngs: ['zh-CN', 'en-US'],
    defaultLng: 'zh-CN',
    resource: {
      loadPath: './locales/{{lng}}/{{ns}}.json', //输入路径
          savePath: './locales/{{lng}}/{{ns}}.json', //输出路径
      jsonIndent: 2,
      lineEnding: '\n',
      endWithEmptyTrans: true,
    },
    removeUnusedKeys: true,
    nsSeparator: false, // namespace separator
    keySeparator: false, // key separator
    interpolation: {
      prefix: '{{',
      suffix: '}}',
    },
  },
  transform: function customTransform(file, enc, done) {
    //自己通过该函数来加工key或value
    'use strict';
    const parser = this.parser;
    const content = fs.readFileSync(file.path, enc);
    parser.parseFuncFromString(
      content,
      { list: ['lang', 't'] },
      (key, options) => {
        options.defaultValue = key;
        let hashKey = `k${crc32(key).toString(16)}`;
        parser.set(hashKey, options);
      }
    );
    done();
  },
};


const output = path.resolve(__dirname, '../');

// For main
const mainstream = vfs
  .src([
    ...scannerConfig.input,
    // '!src/plugins/**'
  ])
  .pipe(sort()) // Sort files in stream by path
  .pipe(
    scanner(
      {
        ...scannerConfig.options,
      },
      scannerConfig.transform
    )
  )
  .pipe(vfs.dest(path.resolve(__dirname, output)));

mainstream.on('finish', () => {
  console.log('项目翻译生成完毕!');
});