#!/usr/bin/env -S deno run --allow-env

/**
 * Internal API Key Generator
 *
 * Generates a secure internal API key and its bcrypt hash for manual insertion
 * into the internal_api_keys table.
 *
 * Usage:
 *   deno run --allow-env scripts/generate-internal-api-key.ts [key_name]
 *
 * Example:
 *   deno run --allow-env scripts/generate-internal-api-key.ts "Analytics Service"
 */

import * as bcrypt from "https://deno.land/x/bcrypt@v0.4.1/mod.ts";

function generateApiKey(): string {
  const characters = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789_-";
  const length = 48;
  let result = "int_shopcall_";

  for (let i = 0; i < length; i++) {
    result += characters.charAt(Math.floor(Math.random() * characters.length));
  }

  return result;
}

async function hashApiKey(apiKey: string): Promise<string> {
  const salt = await bcrypt.genSalt(12);
  return await bcrypt.hash(apiKey, salt);
}

async function main() {
  const args = Deno.args;
  const keyName = args[0] || "Untitled Internal Key";

  console.log("\n🔑 Generating Internal API Key...\n");
  console.log("━".repeat(80));

  // Generate API key
  const apiKey = generateApiKey();
  console.log("\n✅ API Key Generated:");
  console.log(`   ${apiKey}`);

  // Generate hash
  console.log("\n⏳ Generating bcrypt hash (this may take a few seconds)...");
  const hash = await hashApiKey(apiKey);
  console.log("✅ Hash Generated:");
  console.log(`   ${hash}`);

  // Generate SQL
  console.log("\n📝 SQL INSERT Statement:");
  console.log("━".repeat(80));
  console.log(`
INSERT INTO internal_api_keys (
  key_name,
  api_key,
  key_hash,
  description,
  created_by,
  expires_at
) VALUES (
  '${keyName}',
  '${apiKey}',
  '${hash}',
  'Auto-generated internal API key',
  'admin',
  NULL  -- or set expiration: '2025-12-31 23:59:59+00'
);
`);

  console.log("━".repeat(80));
  console.log("\n⚠️  IMPORTANT:");
  console.log("   1. Store the API key securely - it cannot be retrieved later!");
  console.log("   2. Execute the SQL statement in your Supabase database");
  console.log("   3. Update the description and created_by fields as needed");
  console.log("   4. Set an expiration date if required");
  console.log("\n📚 See INTERNAL_API_KEYS.md for usage documentation\n");
}

if (import.meta.main) {
  main();
}
