#!/usr/bin/env node

'use strict';

const fs = require('fs');
const path = require('path');

const version = process.argv[2];
if (
  version == null ||
  !/^[0-9]+\.[0-9]+\.[0-9]+(?:-[0-9A-Za-z.-]+)?(?:\+[0-9A-Za-z.-]+)?$/.test(
    version
  )
) {
  console.error('Usage: update-rust-crate-version.js <semver>');
  process.exit(1);
}

const manifestPath = path.join(__dirname, '..', 'Cargo.toml');
const manifest = fs.readFileSync(manifestPath, 'utf8');
const packageVersionMatch = manifest.match(
  /\[workspace\.package\]\nversion = "([^"]+)"/
);

if (packageVersionMatch == null) {
  throw new Error('Could not find the workspace package version');
}

const currentVersion = packageVersionMatch[1];
const internalDependencyPattern = new RegExp(
  `(react_compiler(?:_[a-z_]+)? = \\{ version = ")${currentVersion.replace(/[.*+?^${}()|[\]\\]/g, '\\$&')}("[^\\n]+\\})`,
  'g'
);
const internalDependencies = manifest.match(internalDependencyPattern) ?? [];

if (internalDependencies.length !== 11) {
  throw new Error(
    `Expected 11 versioned internal dependencies, found ${internalDependencies.length}`
  );
}

const updatedManifest = manifest
  .replace(
    `[workspace.package]\nversion = "${currentVersion}"`,
    `[workspace.package]\nversion = "${version}"`
  )
  .replace(internalDependencyPattern, `$1${version}$2`);

fs.writeFileSync(manifestPath, updatedManifest);