// add-user.ts — Crea o actualiza un usuario interno de la plataforma.
// Usa la conexión definida en backend/.env (puede ser tu BD local o, con
// el túnel SSH abierto, la del servidor).
//
// Uso directo:
//   pnpm --filter backend exec tsx scripts/add-user.ts <username> <password> "<Nombre>"
//   pnpm --filter backend exec tsx scripts/add-user.ts <username> <password> "<Nombre>" --reset
//
// El wrapper ./add-user.sh hace lo mismo desde la raíz.
import { prisma } from "../src/prisma.js";
import { hashPassword } from "../src/lib/password.js";

async function main() {
  const args = process.argv.slice(2);
  const reset = args.includes("--reset");
  const [username, password, name] = args.filter((a) => a !== "--reset");

  if (!username || !password || !name) {
    console.error(
      "Uso: tsx scripts/add-user.ts <username> <password> \"<Nombre>\" [--reset]"
    );
    process.exit(1);
  }
  if (username.length < 1 || username.length > 50) {
    console.error("username debe tener entre 1 y 50 caracteres");
    process.exit(1);
  }
  if (password.length < 8) {
    console.error("password debe tener al menos 8 caracteres");
    process.exit(1);
  }
  if (name.length < 1 || name.length > 120) {
    console.error("name debe tener entre 1 y 120 caracteres");
    process.exit(1);
  }

  const existing = await prisma.user.findUnique({ where: { username } });

  if (existing && !reset) {
    console.error(
      `Ya existe el usuario "${username}". Si querés cambiar su password/nombre, agregá --reset.`
    );
    process.exit(2);
  }

  const passwordHash = await hashPassword(password);

  if (existing) {
    await prisma.user.update({
      where: { username },
      data: { passwordHash, name, active: true },
    });
    console.log(`✓ Usuario "${username}" actualizado (password reseteado).`);
  } else {
    await prisma.user.create({
      data: { username, passwordHash, name },
    });
    console.log(`✓ Usuario "${username}" creado.`);
  }
}

main()
  .catch((err) => {
    console.error("Error:", err.message ?? err);
    process.exit(1);
  })
  .finally(() => prisma.$disconnect());
