import {
  PrismaClient,
  EventType,
  EventStatus,
} from "@/prisma/generated/prisma/client";
import { PrismaBetterSqlite3 } from "@prisma/adapter-better-sqlite3";
import bcrypt from "bcryptjs";

const adapter = new PrismaBetterSqlite3({
  url: process.env.DATABASE_URL || "file:./dev.db",
});
const prisma = new PrismaClient({ adapter });

async function main() {
  // Créer un utilisateur admin
  const adminPassword = await bcrypt.hash("admin123", 10);
  const admin = await prisma.user.upsert({
    where: { email: "admin@got-mc.com" },
    update: {},
    create: {
      email: "admin@got-mc.com",
      username: "Admin",
      password: adminPassword,
      role: "ADMIN",
      score: 0,
      level: 1,
    },
  });

  // Créer quelques utilisateurs de test
  const userPassword = await bcrypt.hash("user123", 10);
  const users = await Promise.all([
    prisma.user.upsert({
      where: { email: "user1@got-mc.com" },
      update: {},
      create: {
        email: "user1@got-mc.com",
        username: "DragonSlayer99",
        password: userPassword,
        score: 125000,
        level: 85,
        hp: 750,
        maxHp: 1000,
        xp: 3250,
        maxXp: 5000,
      },
    }),
    prisma.user.upsert({
      where: { email: "user2@got-mc.com" },
      update: {},
      create: {
        email: "user2@got-mc.com",
        username: "MineMaster",
        password: userPassword,
        score: 118500,
        level: 82,
      },
    }),
    prisma.user.upsert({
      where: { email: "user3@got-mc.com" },
      update: {},
      create: {
        email: "user3@got-mc.com",
        username: "CraftKing",
        password: userPassword,
        score: 112000,
        level: 80,
      },
    }),
  ]);

  // Créer des événements (vérifier s'ils existent déjà)
  const eventData = [
    {
      date: "18 NOVEMBRE 2023",
      name: "Sommet de l'Innovation Tech",
      description:
        "Rejoignez les leaders de l'industrie et les innovateurs pour une journée de discussions sur les technologies de pointe, les percées de l'IA et des opportunités de networking.",
      type: EventType.SUMMIT,
      status: EventStatus.PAST,
    },
    {
      date: "3 DÉCEMBRE 2023",
      name: "Lancement de la Révolution IA",
      description:
        "Assistez au lancement de systèmes d'IA révolutionnaires qui vont remodeler le paysage du gaming. Aperçus exclusifs et opportunités d'accès anticipé.",
      type: EventType.LAUNCH,
      status: EventStatus.PAST,
    },
    {
      date: "22 DÉCEMBRE 2023",
      name: "Festival du Code d'Hiver",
      description:
        "Une célébration de l'excellence en programmation avec des hackathons, des défis de codage et des prix. Montrez vos compétences et rivalisez avec les meilleurs développeurs.",
      type: EventType.FESTIVAL,
      status: EventStatus.PAST,
    },
    {
      date: "15 JANVIER 2024",
      name: "Expo Informatique Quantique",
      description:
        "Explorez l'avenir de l'informatique quantique dans le gaming. Démonstrations interactives, conférences d'experts et ateliers pratiques pour tous les niveaux.",
      type: EventType.SUMMIT,
      status: EventStatus.UPCOMING,
    },
    {
      date: "8 FÉVRIER 2024",
      name: "Championnat Cyber Arena",
      description:
        "L'événement de gaming compétitif ultime. Compétissez pour la gloire, des récompenses exclusives et le titre de Champion Cyber Arena. Inscriptions ouvertes.",
      type: EventType.COMPETITION,
      status: EventStatus.UPCOMING,
    },
    {
      date: "12 MARS 2024",
      name: "Gala Tech du Printemps",
      description:
        "Une soirée élégante célébrant les réalisations technologiques. Cérémonie de remise de prix, networking et annonces exclusives des plus grandes entreprises tech.",
      type: EventType.FESTIVAL,
      status: EventStatus.UPCOMING,
    },
  ];

  const events = await Promise.all(
    eventData.map(async (data) => {
      const existing = await prisma.event.findFirst({
        where: { name: data.name },
      });
      if (existing) return existing;
      return prisma.event.create({ data });
    })
  );

  console.log("Seed completed:", { admin, users, events });
}

main()
  .catch((e) => {
    console.error(e);
    process.exit(1);
  })
  .finally(async () => {
    await prisma.$disconnect();
  });
