#!/usr/bin/env node
/**
 *
 *    Copyright (c) 2023 Silicon Labs
 *
 *    Licensed under the Apache License, Version 2.0 (the "License");
 *    you may not use this file except in compliance with the License.
 *    You may obtain a copy of the License at
 *
 *        http://www.apache.org/licenses/LICENSE-2.0
 *
 *    Unless required by applicable law or agreed to in writing, software
 *    distributed under the License is distributed on an "AS IS" BASIS,
 *    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 *    See the License for the specific language governing permissions and
 *    limitations under the License.
 */

const scriptUtil = require('./script-util.js')
const os = require('os')
const path = require('path')
const fs = require('fs')
const yargs = require('yargs/yargs')
const { hideBin } = require('yargs/helpers')

/**
 *
 * @param {*} osName
 * @param {*} outputPath
 */
async function buildForOS(osName, outputPath) {
  switch (osName) {
    case 'm':
      console.log(`Building for Mac... Output: ${outputPath}`)
      await scriptUtil.executeCmd({}, 'npm', ['run', 'pack:mac']) // Building electron app
      await scriptUtil.executeCmd({}, 'npm', ['run', 'pkg:mac']) // Building zap-cli
      await scriptUtil.executeCmd({}, 'npm', ['run', 'pack:cli:mac']) // Adding zap-cli to zip file
      if (outputPath) {
        await scriptUtil.executeCmd({}, 'mv', [
          './dist/zap-mac-x64.zip',
          path.join(outputPath, 'zap-mac-x64.zip')
        ])
        await scriptUtil.executeCmd({}, 'mv', [
          './dist/zap-mac-arm64.zip',
          path.join(outputPath, 'zap-mac-arm64.zip')
        ])
      }
      break

    case 'w':
      console.log(`Building for Windows... Output: ${outputPath}`)
      await scriptUtil.executeCmd({}, 'npm', ['run', 'pack:win']) // Building electron app
      await scriptUtil.executeCmd({}, 'npm', ['run', 'pkg:win']) // Building zap-cli
      await scriptUtil.executeCmd({}, 'npm', ['run', 'pack:cli:win']) // Adding zap-cli to zip file
      if (outputPath) {
        await scriptUtil.executeCmd({}, 'mv', [
          'dist/zap-win-x64.zip',
          path.join(outputPath, 'zap-win-x64.zip')
        ])
        await scriptUtil.executeCmd({}, 'mv', [
          'dist/zap-win-arm64.zip',
          path.join(outputPath, 'zap-win-arm64.zip')
        ])
      }
      break

    case 'l':
      console.log(`Building for Linux... Output: ${outputPath}`)
      await scriptUtil.executeCmd({}, 'npm', ['run', 'pack:linux']) // Building electron app
      await scriptUtil.executeCmd({}, 'npm', ['run', 'pkg:linux']) // Building zap-cli
      await scriptUtil.executeCmd({}, 'npm', ['run', 'pack:cli:linux']) // Adding zap-cli to zip file
      if (outputPath) {
        await scriptUtil.executeCmd({}, 'mv', [
          'dist/zap-linux-x64.zip',
          path.join(outputPath, 'zap-linux-x64.zip')
        ])
        await scriptUtil.executeCmd({}, 'mv', [
          'dist/zap-linux-arm64.zip',
          path.join(outputPath, 'zap-linux-arm64.zip')
        ])
        await scriptUtil.executeCmd({}, 'mv', [
          'dist/zap-linux-amd64.deb',
          path.join(outputPath, 'zap-linux-amd64.deb')
        ])
        await scriptUtil.executeCmd({}, 'mv', [
          'dist/zap-linux-x64_64.rpm',
          path.join(outputPath, 'zap-linux-x64_64.rpm')
        ])
      }
      break

    default:
      console.error(`Error: Unsupported platform: ${osName}`)
      process.exit(1)
  }
}

const argv = yargs(hideBin(process.argv))
  .option('platform', {
    alias: 'p',
    type: 'string',
    description: 'Specify the platform(s) to build for (m, w, l)'
  })
  .option('output', {
    alias: 'o',
    type: 'string',
    description: 'Specify the output directory for the build files'
  })
  .help()
  .strict().argv

let targets = argv.platform
let outputPath = argv.output

if (outputPath && !fs.existsSync(outputPath)) {
  fs.mkdirSync(outputPath, { recursive: true })
  console.log(`Created output directory: ${outputPath}`)
}

if (!targets) {
  const currentPlatform = os.platform()
  switch (currentPlatform) {
    case 'darwin':
      targets = 'm' // Mac
      break
    case 'win32':
      targets = 'w' // Windows
      break
    case 'linux':
      targets = 'l' // Linux
      break
    default:
      console.error(`Error: Unsupported platform: ${currentPlatform}`)
      process.exit(1)
  }
  console.log(`No target specified. Defaulting to current system: ${targets}`)
}

const targetPlatforms = targets.split('')

targetPlatforms.forEach(async (target) => {
  await buildForOS(target, outputPath)
})
