/****
 * 批量编译打包模板工具
 * 运行 npm run publish T_01 命令来打包T_01模板
 * 运行 npm run publish T_01,T_02,T_03,T_04  命令来分别打包 T_01,T_02,T_03,T_04 这四个模板,注意逗号要用英文的
 * 运行 npm run publish all 命令来打包所有模板
 */

const spawn = require('child_process').spawn;
const path = require("path");
const fs = require("fs");
const os = require('os');
const compressing = require("compressing");

//Linux系统上'Linux'
//macOS 系统上'Darwin'
//Windows系统上'Windows_NT'
let sysType = os.type();

Date.prototype.Format = function(fmt) {
  var o = {
      "M+" : this.getMonth() + 1,
      "d+" : this.getDate(),
      "h+" : this.getHours(),
      "m+" : this.getMinutes(),
      "s+" : this.getSeconds(),
      "q+" : Math.floor((this.getMonth() + 3) / 3),
      "S" : this.getMilliseconds()
  };
  if (/(y+)/.test(fmt))
      fmt = fmt.replace(RegExp.$1, (this.getFullYear() + "").substr(4 - RegExp.$1.length));
  for (var k in o)
  if (new RegExp("(" + k + ")").test(fmt))
      fmt = fmt.replace(RegExp.$1, (RegExp.$1.length == 1) ? (o[k]) : (("00" + o[k]).substr(("" + o[k]).length)));
  return fmt;
}

function clean(zipPath){
  if(fs.existsSync(zipPath)){
    fs.unlinkSync(zipPath);
  }
}

const runSpawn = async function (){

  await new Promise(function(resolve,reject){

    let pkg = require("../package.json");

    let ls;
    if(sysType==="Windows_NT"){
      //ng build --prod --build--optimizer --base-href /ng-one/
      ls = spawn("cmd.exe", ['/c', 'ng', 'build', '--prod', '--build--optimizer', '--base-href', '/template-base-href/'] );
    }else{
      ls = spawn("ng", ['build', '--prod', '--build--optimizer', '--base-href', '/template-base-href/'] );
    }

    ls.stdout.on('data', (data) => {
      console.log(` ${data}`);
    });

    ls.stderr.on('data', (data) => {
      console.log(`stderr: ${data}`);
      reject();
    });

    ls.on('close', (code) => {
      console.log(`child process exited with code ${code}`);
      //要压缩的目录
      let zippath = path.resolve(__dirname,"../dist", pkg.name);
      //压缩包的存放目录
      let date = new Date();
      let zipname = pkg.name+"_"+date.Format("yyyyMMdd hh-mm-ss");
      let zipdir = path.resolve(__dirname,"../publish/"+zipname+".zip");
      clean(zipdir); //删除原有的包

      const tarStream = new compressing.zip.Stream();
      fs.readdir(zippath,function(err,files){
        if(err){
          console.log("======文件打开异常======");
          console.log(err);
          reject();
        }
        for(let i=0;i<files.length;i++){
          tarStream.addEntry(zippath+"/"+files[i]);
        }
        let writeStream = fs.createWriteStream(zipdir);
        tarStream.pipe(writeStream);
        writeStream.on('close', () => {
            console.log(`模板 ${pkg.name} 打包已完成!`);
            resolve();
        })
      });

    });

  });
}

// let projects = "";
// if(process.argv.length<3){
//   console.log("缺少参数");
//   return;
// }
// projects = process.argv[2];

let exec = async function(){
  //压缩模板
  await runSpawn();
}

exec();