// @ts-nocheck

import { main } from "../package.json"
import { join } from "path"
import * as electron from "electron"
import * as dotenv from "dotenv"
import * as ora from "ora"
import * as chalk from "chalk"
import * as minimist from "minimist"

import { exec, spawn, ChildProcess } from "child_process"
import { watch, rollup, OutputOptions } from "rollup"
import { waitOn } from "./utils"
import options from "./rollup.config"
// 注入环境变量
dotenv.config({ path: join(__dirname, "../.env") })
// 解析命令行参数
const argv = minimist(process.argv.slice(2))
// rollup配置
const opts = options(argv.env)
const TAG = "[build-main.ts]"
// 加载图
const spinner = ora(`${TAG} Electron build...`)

function buildVite() {
  return new Promise((resolve, reject) => {
    let viteProcess = spawn("node", [join(__dirname, "../node_modules/vite/bin/vite.js"), "build"], {
      stdio: "pipe",
      env: Object.assign(process.env, { NODE_ENV: argv.env }),
    })
    if (viteProcess) {
      viteProcess.stdout.on("end", data => {
        console.log(`\n[vite build end]`)
        resolve(viteProcess)
      })
      viteProcess.stderr.on("data", data => {
        console.error(`\n[vite build err]: ${data}`)
        reject()
      })
    } else {
      reject()
    }
  })
}
function tscCheck() {
  return new Promise((resolve, reject) => {
    let tscProcess = spawn("node", [join(__dirname, "../node_modules/typescript/bin/tsc")], {
      stdio: "pipe",
      env: Object.assign(process.env, { NODE_ENV: argv.env }),
    })
    if (tscProcess) {
      tscProcess.stdout.on("end", data => {
        console.log(`[tsc check end]`)
        resolve(tscProcess)
      })
      tscProcess.stderr.on("data", data => {
        console.error(`[tsc check err]: ${data}`)
        reject()
      })
    } else {
      reject()
    }
  })
}
async function buildMain() {
  try {
    const build = await rollup(opts)
    build.write(opts.output as OutputOptions)
  } catch (error) {
    console.log(`\n${TAG} ${chalk.red("构建报错")}\n`, error, "\n")
  }
}

function buildElectron() {
  return new Promise((resolve, reject) => {
    let tscProcess = spawn("node", [join(__dirname, "../node_modules/@electron-forge/cli/dist/electron-forge.js"), "make"], {
      stdio: "pipe",
      env: Object.assign(process.env, { NODE_ENV: argv.env }),
    })
    if (tscProcess) {
      tscProcess.stdout.on("data", data => {
        console.log(`[electron build]: ${data}`)
      })
      tscProcess.stdout.on("end", data => {
        console.log(`[electron build end]`)
        resolve(tscProcess)
      })
      tscProcess.stderr.on("data", data => {
        console.error(`[electron build err]: ${data}`)
        reject()
      })
    } else {
      reject()
    }
  })
}
;(async () => {
  await tscCheck()
  await buildVite()
  await buildMain()
  // await buildElectron()
})()