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

const prisma = new PrismaClient();

async function main() {
  // Clean existing data
  await prisma.notification.deleteMany();
  await prisma.leaveRequest.deleteMany();
  await prisma.leaveBalance.deleteMany();
  await prisma.leaveType.deleteMany();
  await prisma.user.deleteMany();

  const hashedPassword = await bcrypt.hash("Password123!", 10);
  const currentYear = new Date().getFullYear();

  // Create users
  const admin = await prisma.user.create({
    data: {
      email: "admin@company.com",
      name: "Sarah Admin",
      password: hashedPassword,
      role: "ADMIN",
      department: "Human Resources",
    },
  });

  const manager1 = await prisma.user.create({
    data: {
      email: "manager1@company.com",
      name: "John Manager",
      password: hashedPassword,
      role: "MANAGER",
      department: "Engineering",
    },
  });

  const manager2 = await prisma.user.create({
    data: {
      email: "manager2@company.com",
      name: "Lisa Manager",
      password: hashedPassword,
      role: "MANAGER",
      department: "Marketing",
    },
  });

  const emp1 = await prisma.user.create({
    data: {
      email: "emp1@company.com",
      name: "Alice Employee",
      password: hashedPassword,
      role: "EMPLOYEE",
      department: "Engineering",
      managerId: manager1.id,
    },
  });

  const emp2 = await prisma.user.create({
    data: {
      email: "emp2@company.com",
      name: "Bob Employee",
      password: hashedPassword,
      role: "EMPLOYEE",
      department: "Engineering",
      managerId: manager1.id,
    },
  });

  const emp3 = await prisma.user.create({
    data: {
      email: "emp3@company.com",
      name: "Carol Employee",
      password: hashedPassword,
      role: "EMPLOYEE",
      department: "Marketing",
      managerId: manager2.id,
    },
  });

  // Create leave types
  const annual = await prisma.leaveType.create({
    data: { name: "Annual Leave", description: "Paid annual vacation leave", defaultDays: 20, color: "#3B82F6" },
  });

  const sick = await prisma.leaveType.create({
    data: { name: "Sick Leave", description: "Paid sick leave for illness", defaultDays: 10, color: "#EF4444" },
  });

  const personal = await prisma.leaveType.create({
    data: { name: "Personal Leave", description: "Personal time off", defaultDays: 5, color: "#8B5CF6" },
  });

  const maternity = await prisma.leaveType.create({
    data: { name: "Maternity Leave", description: "Maternity leave for new mothers", defaultDays: 90, color: "#EC4899" },
  });

  const paternity = await prisma.leaveType.create({
    data: { name: "Paternity Leave", description: "Paternity leave for new fathers", defaultDays: 14, color: "#06B6D4" },
  });

  const unpaid = await prisma.leaveType.create({
    data: { name: "Unpaid Leave", description: "Leave without pay", defaultDays: 30, color: "#6B7280" },
  });

  const leaveTypes = [annual, sick, personal, maternity, paternity, unpaid];
  const allUsers = [admin, manager1, manager2, emp1, emp2, emp3];

  // Create leave balances for all users
  for (const user of allUsers) {
    for (const lt of leaveTypes) {
      await prisma.leaveBalance.create({
        data: {
          userId: user.id,
          leaveTypeId: lt.id,
          year: currentYear,
          allocated: lt.defaultDays,
          used: 0,
          pending: 0,
          carriedOver: 0,
        },
      });
    }
  }

  // Create sample leave requests
  const req1 = await prisma.leaveRequest.create({
    data: {
      userId: emp1.id,
      leaveTypeId: annual.id,
      startDate: new Date(currentYear, 3, 14), // April 14
      endDate: new Date(currentYear, 3, 18),   // April 18
      totalDays: 5,
      reason: "Family vacation to the beach",
      status: "APPROVED",
      approverId: manager1.id,
      approverNote: "Enjoy your vacation!",
    },
  });

  // Update balance for approved request
  await prisma.leaveBalance.updateMany({
    where: { userId: emp1.id, leaveTypeId: annual.id, year: currentYear },
    data: { used: 5 },
  });

  const req2 = await prisma.leaveRequest.create({
    data: {
      userId: emp1.id,
      leaveTypeId: sick.id,
      startDate: new Date(currentYear, 2, 24), // March 24
      endDate: new Date(currentYear, 2, 25),   // March 25
      totalDays: 2,
      reason: "Feeling unwell, need to rest",
      status: "APPROVED",
      approverId: manager1.id,
    },
  });

  await prisma.leaveBalance.updateMany({
    where: { userId: emp1.id, leaveTypeId: sick.id, year: currentYear },
    data: { used: 2 },
  });

  const req3 = await prisma.leaveRequest.create({
    data: {
      userId: emp2.id,
      leaveTypeId: annual.id,
      startDate: new Date(currentYear, 4, 5),  // May 5
      endDate: new Date(currentYear, 4, 9),    // May 9
      totalDays: 5,
      reason: "Attending a wedding abroad",
      status: "PENDING",
    },
  });

  await prisma.leaveBalance.updateMany({
    where: { userId: emp2.id, leaveTypeId: annual.id, year: currentYear },
    data: { pending: 5 },
  });

  const req4 = await prisma.leaveRequest.create({
    data: {
      userId: emp3.id,
      leaveTypeId: personal.id,
      startDate: new Date(currentYear, 2, 28), // March 28
      endDate: new Date(currentYear, 2, 28),   // March 28
      totalDays: 1,
      reason: "Moving to a new apartment",
      status: "REJECTED",
      approverId: manager2.id,
      approverNote: "Please reschedule - team deadline that week",
    },
  });

  const req5 = await prisma.leaveRequest.create({
    data: {
      userId: emp2.id,
      leaveTypeId: sick.id,
      startDate: new Date(currentYear, 1, 10), // Feb 10
      endDate: new Date(currentYear, 1, 11),   // Feb 11
      totalDays: 2,
      reason: "Doctor appointment and recovery",
      status: "APPROVED",
      approverId: manager1.id,
    },
  });

  await prisma.leaveBalance.updateMany({
    where: { userId: emp2.id, leaveTypeId: sick.id, year: currentYear },
    data: { used: 2 },
  });

  // Create notifications
  await prisma.notification.createMany({
    data: [
      {
        userId: emp1.id,
        title: "Leave Approved",
        message: "Your Annual Leave request (Apr 14-18) has been approved.",
        type: "SUCCESS",
        isRead: true,
        link: "/dashboard/leaves",
      },
      {
        userId: emp1.id,
        title: "Leave Approved",
        message: "Your Sick Leave request (Mar 24-25) has been approved.",
        type: "SUCCESS",
        isRead: false,
        link: "/dashboard/leaves",
      },
      {
        userId: manager1.id,
        title: "New Leave Request",
        message: "Bob Employee has submitted a leave request for May 5-9.",
        type: "INFO",
        isRead: false,
        link: "/dashboard/approvals",
      },
      {
        userId: emp3.id,
        title: "Leave Rejected",
        message: "Your Personal Leave request (Mar 28) was rejected.",
        type: "ERROR",
        isRead: false,
        link: "/dashboard/leaves",
      },
      {
        userId: manager2.id,
        title: "Leave Request Cancelled",
        message: "Carol Employee cancelled their leave request.",
        type: "WARNING",
        isRead: true,
      },
      {
        userId: admin.id,
        title: "System Notice",
        message: "Leave balances for 2026 have been initialized.",
        type: "INFO",
        isRead: false,
      },
    ],
  });

  console.log("Seed data created successfully!");
  console.log("Demo accounts (password: Password123!):");
  console.log("  Admin:    admin@company.com");
  console.log("  Manager:  manager1@company.com, manager2@company.com");
  console.log("  Employee: emp1@company.com, emp2@company.com, emp3@company.com");
}

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