#! /usr/bin/env node
const chalk = require('chalk');
const { program } = require('commander');
const inquirer = require('inquirer');
const { NodeSSH } = require('node-ssh');
const { exec } = require('child_process');
const ora = require('ora');
const fs = require('fs');
const path = require('path');
const packager = require('../package.json');
const uiPackager = require('../packages/ui/package.json');
const utilsPackager = require('../packages/utils/package.json');
const directivesPackager = require('../packages/directives/package.json');

const spinner = ora();
const getVersionMax = (...args) =>
  args
    .map(item => {
      return +item.split('.')[2];
    })
    .reduce((prev, cur) => {
      if (prev > cur) return prev;
      return cur;
    }, 0);

const setSameVersion = (packagePath, version) => {
  const data = fs.readFileSync(path.resolve(__dirname, packagePath), 'utf8');
  const configData = JSON.parse(data);
  configData.version = `1.0.${version + 1}`;

  fs.writeFileSync(
    path.resolve(__dirname, packagePath),
    JSON.stringify(configData, null, '\t'),
    'utf8',
  );
  log(`⭐️ ${packagePath} version set 1.0.${version + 1}`, 'green');
};
const log = (str, color = 'white') => {
  console.log(chalk[color](str));
};
const ssh = new NodeSSH();
program.option('-v, --version', '查看版本号', () => {
  log(`当前版本：${packager.version}`, 'green');
});

program
  .command('publish')
  .description('发布')
  .action(async () => {
    spinner.start(log('开始构建dist', 'yellow'));

    await exec('pnpm docs:build', err => {
      if (err) {
        return log('构建失败', 'red');
      }
      (async () => {
        spinner.succeed(log('构建完成dist', 'green'));
        spinner.start(log('正在连接服务器', 'yellow'));
        ssh
          .connect({
            host: `106.15.250.42`,
            port: 22,
            username: 'root',
            password: '20100501zzL',
            readyTimeout: 10000,
            tryKeyboard: true,
          })
          .then(async () => {
            spinner.succeed(log('ssh连接成功', 'green'));
            spinner.start(log('正在传输文件', 'yellow'));
            // ssh
            //   .exec('rm -rf /root/web/html3')
            //   .then(res => {
            //     log('清空文件夹完成', 'gerrn');
            //   });
            ssh
              .putDirectory(
                `${process.cwd()}/docs/.vitepress/dist`,
                '/root/web/html3',
                {
                  tick: (localPath, remotePath, error) => {
                    if (error) {
                      log(error, 'red');
                    } else {
                      spinner.succeed(
                        log(`${localPath} => ${remotePath}`, 'green'),
                      );
                    }
                  },
                },
              )
              .then(() => {
                log('✨✨✨发布成功', 'green');
                spinner.clear();
                process.exit(0);
              });
          })
          .catch(err => {
            log(err, 'red');
          });
      })();
    });
  });

program
  .command('sameVersion')
  .description('统一npm包版本号')
  .action(async () => {
    const uiV = uiPackager.version;
    const utilsV = utilsPackager.version;
    const directivesV = directivesPackager.version;
    const v = packager.version;
    const packagePathList = [
      '../package.json',
      '../packages/ui/package.json',
      '../packages/directives/package.json',
      '../packages/utils/package.json',
    ];
    packagePathList.forEach(path => setSameVersion(path, getVersionMax(uiV, utilsV, directivesV, v)));
  });

program.parse(process.argv);
