#!/usr/bin/env node

import {
  copyFileSync,
  mkdirSync,
  rmSync,
  statSync,
} from 'node:fs';
import path from 'node:path';

const args = process.argv.slice(2);
const outDirIndex = args.indexOf('--out-dir');
if (outDirIndex === -1 || !args[outDirIndex + 1]) {
  fail('Missing required --out-dir argument');
}

const outDir = path.resolve(args[outDirIndex + 1]);
const inputs = args.filter(
  (_, index) => index !== outDirIndex && index !== outDirIndex + 1,
);

if (inputs.length === 0) {
  fail('No release assets were provided');
}

const byName = new Map();
for (const input of inputs) {
  const source = path.resolve(input);
  let stats;
  try {
    stats = statSync(source);
  } catch {
    fail(`Release asset was not found: ${input}`);
  }
  if (!stats.isFile()) {
    fail(`Release asset is not a file: ${input}`);
  }

  const name = path.basename(source);
  const previous = byName.get(name);
  if (previous) {
    fail(`Duplicate release asset name ${name}: ${previous} conflicts with ${source}`);
  }
  byName.set(name, source);
}

rmSync(outDir, { recursive: true, force: true });
mkdirSync(outDir, { recursive: true });

for (const [name, source] of byName) {
  copyFileSync(source, path.join(outDir, name));
}

console.log(`Staged ${byName.size} uniquely named GitHub release assets in ${outDir}`);

function fail(message) {
  console.error(`[stage-release-assets] ${message}`);
  process.exit(1);
}