'use strict';

const fs = require('fs');
const path = require('path');
const { spawnSync } = require('child_process');

const rootDir = path.resolve(__dirname, '..');
const ohosDir = path.join(rootDir, 'ohos_hap');
const appResourceDir = path.join(ohosDir, 'web_engine/src/main/resources/resfile/resources/app');

const run = (command, args, options = {}) => {
  const result = spawnSync(command, args, {
    cwd: rootDir,
    stdio: 'inherit',
    ...options
  });

  if (result.error) {
    throw result.error;
  }
  if (result.status !== 0) {
    process.exit(result.status || 1);
  }
};

const commandExists = command => {
  const result = spawnSync('/bin/zsh', ['-lc', `command -v ${command}`], {
    encoding: 'utf8'
  });
  return result.status === 0 ? result.stdout.trim() : '';
};

const findHvigor = () => {
  const candidates = [
    path.join(ohosDir, 'hvigorw'),
    path.join(ohosDir, 'hvigor/bin/hvigorw'),
    '/Applications/DevEco-Studio.app/Contents/tools/hvigor/bin/hvigorw',
    commandExists('hvigorw'),
    commandExists('hvigor')
  ].filter(Boolean);

  return candidates.find(candidate => {
    try {
      return fs.statSync(candidate).isFile();
    } catch {
      return false;
    }
  });
};

const hasOhosToolchains = sdkHome => {
  if (!sdkHome) {
    return false;
  }

  return fs.existsSync(path.join(sdkHome, 'openharmony/toolchains')) ||
    fs.existsSync(path.join(sdkHome, 'default/openharmony/toolchains'));
};

const findSdkHome = () => {
  const candidates = [
    process.env.DEVECO_SDK_HOME,
    '/Applications/DevEco-Studio.app/Contents/sdk',
    '/Applications/DevEco-Studio.app/Contents/sdk/default'
  ].filter(Boolean);

  return candidates.find(hasOhosToolchains);
};

const ensureOhosDependencies = () => {
  for (const cwd of [ohosDir, path.join(ohosDir, 'web_engine'), path.join(ohosDir, 'electron')]) {
    run('ohpm', ['install'], { cwd });
  }
};

run(process.execPath, [path.join(__dirname, 'build-ohos-package.cjs')], {
  env: {
    ...process.env,
    OHOS_HOPPSCOTCH_OUT: appResourceDir
  }
});

ensureOhosDependencies();

const hvigor = findHvigor();
if (!hvigor) {
  console.error('Cannot find hvigor/hvigorw. Open ohos_hap in DevEco Studio, or install HarmonyOS build tools.');
  process.exit(1);
}

const sdkHome = findSdkHome();
if (!sdkHome) {
  console.error('Cannot find DevEco SDK. Set DEVECO_SDK_HOME or build ohos_hap in DevEco Studio.');
  process.exit(1);
}

run(hvigor, ['assembleHap'], {
  cwd: ohosDir,
  env: {
    ...process.env,
    DEVECO_SDK_HOME: sdkHome
  }
});