import { auth, firestore } from '../src/config/firebase.js';
import { prisma } from '../src/config/prisma.js';
import { env } from '../src/config/env.js';

async function main() {
  const email = process.env.ADMIN_EMAIL;
  const password = process.env.ADMIN_PASSWORD;

  if (!email || !password) {
    console.error('Missing ADMIN_EMAIL or ADMIN_PASSWORD in .env');
    process.exit(1);
  }

  let uid: string;
  let displayName: string | undefined;
  let photoURL: string | undefined;

  try {
    // Check if user already exists in Firebase Auth
    const user = await auth.getUserByEmail(email);
    console.log(`Firebase user with email ${email} already exists. UID: ${user.uid}`);
    uid = user.uid;
    displayName = user.displayName;
    photoURL = user.photoURL;
  } catch (error: any) {
    if (error.code === 'auth/user-not-found') {
      console.log(`Creating new Firebase user for ${email}...`);
      const newUser = await auth.createUser({
        email,
        password,
        displayName: 'VoxaLearn Admin',
      });
      console.log(`Successfully created Firebase user. UID: ${newUser.uid}`);
      uid = newUser.uid;
      displayName = newUser.displayName;
      photoURL = newUser.photoURL;
    } else {
      console.error('Error fetching Firebase user:', error);
      process.exit(1);
    }
  }

  // Ensure user is marked as Admin in PostgreSQL
  console.log(`Ensuring PostgreSQL Admin record exists for UID: ${uid}...`);
  const admin = await prisma.admin.upsert({
    where: { firebaseUid: uid },
    update: {
      displayName: displayName || null,
      photoUrl: photoURL || null,
    },
    create: {
      firebaseUid: uid,
      displayName: displayName || null,
      photoUrl: photoURL || null,
    },
  });

  console.log(`Ensuring Firestore record exists for UID: ${uid}...`);
  await firestore.collection('users').doc(uid).set({
    email,
    role: 'ADMIN',
    ...(displayName && { displayName }),
    ...(photoURL && { photoUrl: photoURL }),
    createdAt: new Date(),
    updatedAt: new Date(),
  }, { merge: true });

  console.log('✅ Admin setup complete!');
  console.log(`Firebase UID: ${admin.firebaseUid}`);
}

main()
  .catch(console.error)
  .finally(() => prisma.$disconnect());
