// Set a user's access role ("user", "admin" or "superadmin") by email.
//
// This is the bootstrap path for the first superadmin: the panel's management
// screens require one, and only a superadmin can promote another, so the very
// first one has to be minted here.
//
// Usage (PowerShell):
//   $env:POCKETBASE_URL="http://10.2.1.10:8027"
//   $env:POCKETBASE_ADMIN_EMAIL="admin@drivervault.local"
//   $env:POCKETBASE_ADMIN_PASSWORD="..."
//   node scripts/set-role.mjs <email> <user|admin|superadmin>

const ROLES = ["user", "admin", "superadmin"];

const PB_URL = (process.env.POCKETBASE_URL || process.env.PB_URL || "http://10.2.1.10:8027").replace(
  /\/+$/,
  "",
);
const ADMIN_EMAIL = process.env.POCKETBASE_ADMIN_EMAIL || process.env.PB_ADMIN_EMAIL;
const ADMIN_PASSWORD = process.env.POCKETBASE_ADMIN_PASSWORD || process.env.PB_ADMIN_PASSWORD;

const [, , email, role] = process.argv;

if (!ADMIN_EMAIL || !ADMIN_PASSWORD) {
  console.error("Set POCKETBASE_ADMIN_EMAIL and POCKETBASE_ADMIN_PASSWORD.");
  process.exit(1);
}
if (!email || !role || !ROLES.includes(role)) {
  console.error(`Usage: node scripts/set-role.mjs <email> <${ROLES.join("|")}>`);
  process.exit(1);
}

async function authenticate() {
  for (const ep of [
    "/api/collections/_superusers/auth-with-password",
    "/api/admins/auth-with-password",
  ]) {
    const res = await fetch(PB_URL + ep, {
      method: "POST",
      headers: { "Content-Type": "application/json" },
      body: JSON.stringify({ identity: ADMIN_EMAIL, password: ADMIN_PASSWORD }),
    });
    if (res.ok) return (await res.json()).token;
  }
  throw new Error("Admin authentication failed.");
}

async function main() {
  console.log(`Connecting to ${PB_URL} ...`);
  const token = await authenticate();

  const q = new URLSearchParams({ filter: `email='${email.replace(/'/g, "")}'`, perPage: "1" });
  const res = await fetch(`${PB_URL}/api/collections/users/records?${q}`, {
    headers: { Authorization: token },
  });
  if (!res.ok) throw new Error(`lookup failed: ${res.status} ${await res.text()}`);
  const items = (await res.json()).items || [];
  if (items.length === 0) throw new Error(`no user with email ${email}`);

  const upd = await fetch(`${PB_URL}/api/collections/users/records/${items[0].id}`, {
    method: "PATCH",
    headers: { "Content-Type": "application/json", Authorization: token },
    body: JSON.stringify({ role }),
  });
  if (!upd.ok) throw new Error(`update failed: ${upd.status} ${await upd.text()}`);
  console.log(`✓ ${email} role set to "${role}"`);
}

main().catch((err) => {
  console.error("\nFailed:", err.message);
  process.exit(1);
});
