import { PrismaClient } from "./generated/client";
import bcrypt from "bcryptjs";
import { isValidPassword } from "../src/common/security/password";

const prisma = new PrismaClient();

async function main() {
  // Seed the localized category catalog.
  const categories = [
    {
      nameAr: "المنزل والصيانة",
      nameEn: "Home & Maintenance",
      slug: "home-maintenance",
      icon: "🏠",
      services: [
        { nameAr: "كهرباء", nameEn: "Electricity", slug: "electricity", icon: "⚡", keywords: ["تمديدات كهربائية", "إنارة", "مقبس", "مفتاح", "عطل كهربائي"] },
        { nameAr: "سباكة", nameEn: "Plumbing", slug: "plumbing", icon: "🔧", keywords: ["تسريب مياه", "أنابيب", "حنفية", "صرف صحي", "مجاري"] },
        { nameAr: "دهان", nameEn: "Painting", slug: "painting", icon: "🎨", keywords: ["طلاء", "صبغ", "جدران", "دهان منزل"] },
        { nameAr: "تركيب أثاث", nameEn: "Furniture Assembly", slug: "furniture-assembly", icon: "🛠️", keywords: ["تجميع أثاث", "خزانة", "طاولة", "سرير", "ايكيا"] },
      ],
    },
    {
      nameAr: "التنظيف",
      nameEn: "Cleaning",
      slug: "cleaning",
      icon: "🧹",
      services: [
        { nameAr: "تنظيف منزلي", nameEn: "Home Cleaning", slug: "home-cleaning", icon: "🧹", keywords: ["تنظيف بيت", "تنظيف شقة", "عاملة تنظيف", "تعقيم"] },
        { nameAr: "تنظيف سجاد", nameEn: "Carpet Cleaning", slug: "carpet-cleaning", icon: "🧽", keywords: ["غسيل سجاد", "موكيت", "بسط", "كنب"] },
      ],
    },
    {
      nameAr: "الحدائق والمساحات الخضراء",
      nameEn: "Gardens & Landscaping",
      slug: "gardens",
      icon: "🌿",
      services: [
        { nameAr: "تنسيق حدائق", nameEn: "Garden Design", slug: "garden-design", icon: "🌿", keywords: ["زراعة", "تشجير", "حديقة منزلية", "تنسيق خارجي"] },
        { nameAr: "قص عشب", nameEn: "Lawn Mowing", slug: "lawn-mowing", icon: "🌱", keywords: ["جز عشب", "حديقة", "نجيل", "قص حشيش"] },
      ],
    },
    {
      nameAr: "الصحة والجمال",
      nameEn: "Health & Beauty",
      slug: "health-beauty",
      icon: "💆",
      services: [
        { nameAr: "حلاقة", nameEn: "Haircut", slug: "haircut", icon: "✂️", keywords: ["قص شعر", "تصفيف شعر", "حلاق", "صالون"] },
        { nameAr: "مساج", nameEn: "Massage", slug: "massage", icon: "💆", keywords: ["تدليك", "استرخاء", "علاج عضلي"] },
      ],
    },
    {
      nameAr: "غير ذلك",
      nameEn: "Other",
      slug: "other",
      icon: "⋯",
      services: [
        { nameAr: "غير ذلك", nameEn: "Other", slug: "other", icon: "⋯", keywords: [] },
      ],
    },
  ];

  for (const cat of categories) {
    const category = await prisma.category.upsert({
      where: { slug: cat.slug },
      update: { nameAr: cat.nameAr, nameEn: cat.nameEn, icon: cat.icon, isActive: true },
      create: {
        nameAr: cat.nameAr,
        nameEn: cat.nameEn,
        slug: cat.slug,
        icon: cat.icon,
        isActive: true,
      },
    });

    for (const svc of cat.services) {
      await prisma.service.upsert({
        where: { slug: svc.slug },
        update: { nameAr: svc.nameAr, nameEn: svc.nameEn, icon: svc.icon, categoryId: category.id, keywords: svc.keywords, isActive: true },
        create: {
          nameAr: svc.nameAr,
          nameEn: svc.nameEn,
          slug: svc.slug,
          icon: svc.icon,
          categoryId: category.id,
          isActive: true,
          keywords: svc.keywords,
        },
      });
    }
  }

  const initialAdminPassword = process.env.INITIAL_ADMIN_PASSWORD;
  if (initialAdminPassword) {
    if (!isValidPassword(initialAdminPassword)) {
      throw new Error("INITIAL_ADMIN_PASSWORD does not meet the password policy.");
    }
    const adminHash = await bcrypt.hash(initialAdminPassword, 12);
    await prisma.user.upsert({
      where: { email: "admin@mawjod.app" },
      update: {},
      create: {
        email: "admin@mawjod.app",
        fullName: "مدير النظام",
        passwordHash: adminHash,
        role: "ADMIN",
        permissions: [
          "users.read",
          "users.manage",
          "users.suspend",
          "users.ban",
          "ads.read",
          "ads.moderate",
          "requests.read",
          "requests.manage",
          "offers.read",
          "reports.manage",
          "notifications.send",
          "settings.write",
          "admins.manage",
          "audit.read",
        ],
      },
    });
  } else {
    console.warn("INITIAL_ADMIN_PASSWORD is not set; administrator creation was skipped.");
  }

  console.log("Seed completed");
}

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