/**
 * Idempotent seed for the P0 smoke test.
 *
 * Creates three credentials-auth users in the dev DB:
 *   admin+p0smoke@local      role=ADMIN   password=p0-smoke-admin
 *   alice+p0smoke@local      role=EDITOR  password=p0-smoke-alice
 *   bob+p0smoke@local        role=EDITOR  password=p0-smoke-bob
 *
 * Emails are explicitly tagged `+p0smoke` so the test set is easy to find
 * and remove later:
 *   DELETE FROM `User` WHERE email LIKE '%+p0smoke@local';
 *
 * Run with:
 *   npx tsx scripts/seed-p0-smoke-users.ts
 *
 * Re-runs are safe — uses `upsert` keyed on email.
 */

import { PrismaClient } from '@prisma/client';
import bcrypt from 'bcryptjs';

const prisma = new PrismaClient();

interface SmokeUser {
    email: string;
    name: string;
    password: string;
    role: 'ADMIN' | 'EDITOR';
}

const USERS: SmokeUser[] = [
    { email: 'admin+p0smoke@local', name: 'P0 Smoke Admin', password: 'p0-smoke-admin', role: 'ADMIN' },
    { email: 'alice+p0smoke@local', name: 'P0 Smoke Alice', password: 'p0-smoke-alice', role: 'EDITOR' },
    { email: 'bob+p0smoke@local',   name: 'P0 Smoke Bob',   password: 'p0-smoke-bob',   role: 'EDITOR' },
];

async function main() {
    console.log('[seed-p0-smoke] hashing passwords...');
    const seeded: { email: string; id: number; role: string }[] = [];

    for (const u of USERS) {
        const hash = await bcrypt.hash(u.password, 10);
        const row = await prisma.user.upsert({
            where: { email: u.email },
            update: {
                role: u.role,
                password: hash,
                authProvider: 'credentials',
            },
            create: {
                email: u.email,
                name: u.name,
                password: hash,
                role: u.role,
                authProvider: 'credentials',
            },
            select: { id: true, email: true, role: true },
        });
        seeded.push(row);
    }

    console.log('\n[seed-p0-smoke] users ready:');
    for (const s of seeded) {
        console.log(`  id=${s.id.toString().padStart(4)}  role=${s.role.padEnd(8)}  ${s.email}`);
    }
    console.log('\n[seed-p0-smoke] passwords are the local part of each email after "+":');
    for (const u of USERS) {
        console.log(`  ${u.email}  ->  ${u.password}`);
    }
    console.log('\n[seed-p0-smoke] cleanup later with:');
    console.log("  DELETE FROM `User` WHERE email LIKE '%+p0smoke@local';");
}

main()
    .catch((e) => {
        console.error('[seed-p0-smoke] FAILED:', e);
        process.exit(1);
    })
    .finally(async () => {
        await prisma.$disconnect();
    });
