/**
 * Demo User Seed Script
 *
 * Creates 4 demo users with different roles (admin, manager, operator, user).
 * Uses Better Auth API to sign up, then Drizzle to update roles directly.
 *
 * Prerequisites:
 * - App must be running on http://localhost:3000
 * - Database tables must exist (run `pnpm db:push` first)
 *
 * Usage:
 *   npx tsx scripts/seed-demo.ts
 */

import 'dotenv/config';
import { db } from '../src/db';
import { user } from '../src/db/schema';
import { eq } from 'drizzle-orm';

const BASE_URL = 'http://localhost:3000';

interface DemoUser {
  name: string;
  email: string;
  password: string;
  role: string;
}

const DEMO_USERS: DemoUser[] = [
  { name: 'Admin', email: 'admin@demo.com', password: 'Demo@123', role: 'admin' },
  { name: 'Manager', email: 'manager@demo.com', password: 'Demo@123', role: 'manager' },
  { name: 'Operator', email: 'operator@demo.com', password: 'Demo@123', role: 'operator' },
  { name: 'User', email: 'user@demo.com', password: 'Demo@123', role: 'user' },
];

async function signUpUser(user: DemoUser): Promise<boolean> {
  try {
    const res = await fetch(`${BASE_URL}/api/auth/sign-up/email`, {
      method: 'POST',
      headers: { 'Content-Type': 'application/json' },
      body: JSON.stringify({
        name: user.name,
        email: user.email,
        password: user.password,
      }),
    });

    if (res.ok) {
      console.log(`  ✅ Created: ${user.email}`);
      return true;
    }

    const data = await res.json();
    if (data.error?.message?.includes('already exists')) {
      console.log(`  ⏭️  Already exists: ${user.email}`);
      return false;
    }

    if (res.status === 404) {
      console.log(`  ⚠️  Make sure the app is running: pnpm dev`);
      return false;
    }

    console.error(`  ❌ Failed: ${user.email} - ${data.error?.message || res.statusText}`);
    return false;
  } catch (err) {
    console.error(`  ❌ Error: ${user.email} - Make sure the app is running on port 3000`);
    return false;
  }
}

async function setUserRole(email: string, role: string): Promise<void> {
  await db.update(user).set({ role }).where(eq(user.email, email));
  console.log(`  ✅ Promoted: ${email} -> ${role}`);
}

async function seed() {
  console.log('\n🚀 Creating demo users...\n');

  for (const u of DEMO_USERS) {
    await signUpUser(u);
  }

  const toPromote = DEMO_USERS.filter(u => u.role !== 'user');
  if (toPromote.length > 0) {
    console.log('\n🔄 Setting roles...\n');
    for (const u of toPromote) {
      await setUserRole(u.email, u.role);
    }
  }

  console.log('\n' + '='.repeat(50));
  console.log('  ✅ All demo users ready!');
  console.log('='.repeat(50));
  console.log('');
  console.log('  👑  Admin    | admin@demo.com    | Demo@123');
  console.log('  📊  Manager  | manager@demo.com  | Demo@123');
  console.log('  🔧  Operator | operator@demo.com | Demo@123');
  console.log('  👤  User     | user@demo.com     | Demo@123');
  console.log('');
  console.log('  🌐  http://localhost:3000/sign-in');
  console.log('');
}

seed().catch(console.error);
