#!/usr/bin/env node
import { readFileSync } from 'fs';

const args = parseArgs(process.argv.slice(2));
const expected = requireArg(args, 'version');
const versions = new Map([
  ['package.json', readJsonVersion('package.json')],
  ['package-lock.json', readJsonVersion('package-lock.json')],
  ['Cargo.toml', readTomlVersion('Cargo.toml', /version = "([^"]+)" # x-release-please-version/)],
  ['BitFun-Installer/package.json', readJsonVersion('BitFun-Installer/package.json')],
  ['BitFun-Installer/package-lock.json', readJsonVersion('BitFun-Installer/package-lock.json')],
  ['BitFun-Installer/src-tauri/Cargo.toml', readTomlVersion('BitFun-Installer/src-tauri/Cargo.toml', /^version = "([^"]+)"/m)],
]);

const mismatches = [...versions].filter(([, version]) => version !== expected);
if (mismatches.length > 0) {
  for (const [file, version] of mismatches) {
    console.error(`[release-version] ${file}: expected ${expected}, found ${version}`);
  }
  process.exit(1);
}
console.log(`[release-version] OK: ${expected}`);

function readJsonVersion(file) {
  return JSON.parse(readFileSync(file, 'utf8')).version;
}

function readTomlVersion(file, pattern) {
  const match = pattern.exec(readFileSync(file, 'utf8'));
  if (!match) throw new Error(`Version was not found in ${file}`);
  return match[1];
}

function parseArgs(rawArgs) {
  const parsed = {};
  for (let i = 0; i < rawArgs.length; i += 1) {
    const arg = rawArgs[i];
    if (!arg.startsWith('--')) continue;
    parsed[arg.slice(2)] = rawArgs[i + 1];
    i += 1;
  }
  return parsed;
}

function requireArg(parsed, key) {
  if (!parsed[key]) throw new Error(`Missing required argument --${key}`);
  return parsed[key];
}