// Do you need to update the dependencies to prevent package.json from updating the dependencies, and no install after others get the code

import path from 'path';
import fs from 'fs-extra';
import { isEqual } from 'lodash';
import { sh } from 'tasksfile';
import { successConsole, errorConsole } from '../utils';

const resolve = (dir: string) => {
  return path.resolve(process.cwd(), dir);
};

const reg = /[\u4E00-\u9FA5\uF900-\uFA2D]/;

let NEED_INSTALL = false;

export async function runPreserve() {
  const cwdPath = process.cwd();
  if (reg.test(cwdPath)) {
    errorConsole(
      'Do not include Chinese, Japanese or Korean in the full path of the project directory, please modify the directory name and run again!'
    );
    errorConsole('项目目录全路径请勿包含中文、日文、韩文,请修改目录名后再次重新运行!');
    process.exit(1);
  }

  fs.mkdirp(resolve('build/.cache'));
  function checkPkgUpdate() {
    const pkg = require('../../package.json');
    const { dependencies, devDependencies } = pkg;
    const depsFile = resolve('build/.cache/deps.json');
    if (!fs.pathExistsSync(depsFile)) {
      NEED_INSTALL = true;
      return;
    }
    const depsJson = require('../.cache/deps.json');

    if (!isEqual(depsJson, { dependencies, devDependencies })) {
      NEED_INSTALL = true;
    }
  }
  checkPkgUpdate();
  if (NEED_INSTALL) {
    // no error
    successConsole(
      'A dependency change is detected, and the dependency is being installed to ensure that the dependency is consistent! (Tip: The project will be executed for the first time)！'
    );
    try {
      await sh('npm run bootstrap ', {
        async: true,
        nopipe: true,
      });

      successConsole('Dependency installation is successful, start running the project！');

      const pkg = require('../../package.json');
      const { dependencies, devDependencies } = pkg;
      const depsFile = resolve('build/.cache/deps.json');
      const deps = { dependencies, devDependencies };
      if (!fs.pathExistsSync(depsFile)) {
        fs.writeFileSync(depsFile, JSON.stringify(deps));
      } else {
        const depsFile = resolve('build/.cache/deps.json');
        const depsJson = require('../.cache/deps.json');
        if (!isEqual(depsJson, deps)) {
          fs.writeFileSync(depsFile, JSON.stringify(deps));
        }
      }
    } catch (error) {}
  }
}
