import { PrismaClient } from "@prisma/client";
import bcrypt from "bcrypt";

const prisma = new PrismaClient({ log: ["error"] });

const users = [
    {
        firstName: "Super",
        lastName: "Admin",
        role: "ADMIN",
        email: "admin@gmail.com",
        password: "demo123",
        isVerified: true,
    },
    {
        firstName: "Test",
        lastName: "Developer",
        role: "ADMIN",
        email: "test@gmail.com",
        password: "demo123",
        isVerified: true,
    },
];

const plans = [
    {
        planType: "trial",
        planName: "Trial",
        actualPrice: 0,
        discountPercentage: 0,
        gstPercentage: 0,
        duration: 7,
        description: "Trial pack for student",
        features: [],
    },
    {
        planType: "basic",
        planName: "Basic",
        actualPrice: 5000,
        discountPercentage: 10,
        gstPercentage: 18,
        duration: 60,
        description: "Basic pack for student",
        features: [],
    },
    {
        planType: "premium",
        planName: "Premium",
        actualPrice: 10000,
        discountPercentage: 10,
        gstPercentage: 18,
        duration: 365,
        description: "Premium pack for student",
        features: [],
    },
];

async function main() {
    console.log("🌱 Seeding database...");

    await Promise.all(
        users.map(async (user) => {
            const hashedPassword = await bcrypt.hash(user.password, 10);

            await prisma.user.upsert({
                where: { email: user.email },
                update: {},
                create: {
                    firstName: user.firstName,
                    lastName: user.lastName,
                    role: user.role as any,
                    email: user.email,
                    password: hashedPassword,
                    isVerified: user.isVerified,
                },
            });

            console.log(`✅ User seeded: ${user.email}`);
        })
    );

    await prisma.subscriptionPlan.createMany({
        data: plans.map((plan) => {
            const priceAfterDiscount =
                plan.actualPrice -
                (plan.actualPrice * plan.discountPercentage) / 100;

            return {
                planName: plan.planName,
                planType: plan.planType,
                actualPrice: plan.actualPrice,
                discountPercentage: plan.discountPercentage,
                gstPercentage: plan.gstPercentage,
                priceAfterDiscount,
                duration: plan.duration,
                features: plan.features,
                description: plan.description,
                isActive: true,
            };
        }),
        skipDuplicates: true,
    });

    console.log("🎉 Database seeding completed");
}

main()
    .catch((error) => {
        console.error("❌ Seed error:", error);
        process.exit(1);
    })
    .finally(async () => {
        await prisma.$disconnect();
    });
