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

const prisma = new PrismaClient();

const PERMISSIONS = [
  { code: "dashboard:view", name: "عرض لوحة التحكم", description: "الاطلاع على لوحة التحكم والإحصائيات" },
  { code: "employees:read", name: "قراءة العمالة", description: "عرض بيانات العمالة" },
  { code: "employees:write", name: "إدارة العمالة", description: "إضافة وتعديل وحذف بيانات العمالة" },
  { code: "documents:read", name: "قراءة المستندات", description: "عرض المستندات" },
  { code: "documents:write", name: "إدارة المستندات", description: "إضافة وتعديل وحذف المستندات" },
  { code: "documents:upload", name: "رفع مرفقات المستندات", description: "رفع ملفات المستندات" },
  { code: "companies:read", name: "قراءة الشركات", description: "عرض الشركات" },
  { code: "companies:write", name: "إدارة الشركات", description: "إضافة وتعديل وحذف الشركات" },
  { code: "attachments:view", name: "عرض المرفقات", description: "عرض وتحميل المرفقات" },
  { code: "attachments:upload", name: "رفع المرفقات", description: "رفع مرفقات للمستندات والموظفين والشركات" },
  { code: "attachments:delete", name: "حذف المرفقات", description: "حذف المرفقات" },
  { code: "reports:view", name: "عرض التقارير", description: "عرض التقارير" },
  { code: "notifications:read", name: "قراءة التنبيهات", description: "عرض التنبيهات" },
  { code: "users:manage", name: "إدارة المستخدمين", description: "إدارة المستخدمين" },
  { code: "roles:manage", name: "إدارة الأدوار", description: "إدارة الأدوار والصلاحيات" },
  { code: "settings:manage", name: "إدارة الإعدادات", description: "إدارة إعدادات النظام والتنبيهات" },
  { code: "audit:view", name: "عرض سجل التدقيق", description: "الاطلاع على سجل التدقيق" },
];

const ROLES: Record<string, string[]> = {
  super_admin: PERMISSIONS.map((p) => p.code),
  admin: [
    "dashboard:view",
    "employees:read", "employees:write",
    "documents:read", "documents:write", "documents:upload",
    "companies:read", "companies:write",
    "attachments:view", "attachments:upload", "attachments:delete",
    "reports:view", "notifications:read",
    "users:manage", "settings:manage", "audit:view",
  ],
  manager: [
    "dashboard:view",
    "employees:read", "employees:write",
    "documents:read", "documents:write", "documents:upload",
    "companies:read", "companies:write",
    "attachments:view", "attachments:upload", "attachments:delete",
    "reports:view", "notifications:read",
  ],
  viewer: [
    "dashboard:view",
    "employees:read", "documents:read",
    "companies:read", "attachments:view",
    "reports:view", "notifications:read",
  ],
};

const DOCUMENT_TYPES = [
  { code: "iqama", nameAr: "إقامة", nameEn: "Iqama", defaultAlertDays: 30 },
  { code: "passport", nameAr: "جواز سفر", nameEn: "Passport", defaultAlertDays: 60 },
  { code: "cr", nameAr: "السجل التجاري", nameEn: "Commercial Registration", defaultAlertDays: 30 },
  { code: "license", nameAr: "رخصة العمل", nameEn: "Work License", defaultAlertDays: 30 },
  { code: "municipality", nameAr: "رخصة البلدية", nameEn: "Municipality License", defaultAlertDays: 45 },
  { code: "civil_defense", nameAr: "رخصة الدفاع المدني", nameEn: "Civil Defense", defaultAlertDays: 45 },
  { code: "sfda", nameAr: "رخصة هيئة الغذاء والدواء", nameEn: "SFDA License", defaultAlertDays: 45 },
  { code: "lease_contract", nameAr: "عقد إيجار", nameEn: "Lease Contract", defaultAlertDays: 60 },
  { code: "professional_license", nameAr: "رخصة مهنية", nameEn: "Professional License", defaultAlertDays: 45 },
  { code: "permit", nameAr: "تصريح", nameEn: "Permit", defaultAlertDays: 30 },
  { code: "certificate", nameAr: "شهادة", nameEn: "Certificate", defaultAlertDays: 30 },
  { code: "insurance", nameAr: "التأمين الطبي", nameEn: "Medical Insurance", defaultAlertDays: 30 },
  { code: "company_contract", nameAr: "عقد الشركة", nameEn: "Company Contract", defaultAlertDays: 60 },
  { code: "other", nameAr: "أخرى", nameEn: "Other", defaultAlertDays: 30 },
];

const SETTINGS = [
  { key: "priority_critical_days", value: "7", description: "أولوية حرجة: عدد الأيام المتبقية قبل الانتهاء" },
  { key: "priority_high_days", value: "30", description: "أولوية عالية: عدد الأيام المتبقية قبل الانتهاء" },
  { key: "priority_medium_days", value: "60", description: "أولوية متوسطة: عدد الأيام المتبقية قبل الانتهاء" },
  { key: "alert_days", value: "30", description: "عدد الأيام قبل الانتهاء لإرسال تنبيه البريد" },
  { key: "alert_periods", value: "60,30,14,7,3,1", description: "فترات التنبيه المتعددة (أيام، مفصولة بفواصل)" },
  { key: "alert_expired", value: "true", description: "إرسال تنبيه عند انتهاء المستند" },
  { key: "cron_time", value: "0 8 * * *", description: "وقت تشغيل مهمة فحص التنبيهات (تعبير cron)" },
  { key: "smtp_host", value: "", description: "خادم SMTP لإرسال البريد" },
  { key: "smtp_port", value: "587", description: "منفذ SMTP" },
  { key: "smtp_secure", value: "false", description: "استخدام TLS آمن" },
  { key: "smtp_user", value: "", description: "اسم مستخدم SMTP" },
  { key: "smtp_pass", value: "", description: "كلمة مرور SMTP" },
  { key: "smtp_from", value: "", description: "عنوان المرسل" },
  { key: "notify_email", value: "", description: "البريد المستلم للتنبيهات والتقرير اليومي" },
];

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

  // Permissions
  for (const p of PERMISSIONS) {
    await prisma.permission.upsert({
      where: { code: p.code },
      update: {},
      create: p,
    });
  }
  const allPermissions = await prisma.permission.findMany();

  // Roles
  for (const [name, perms] of Object.entries(ROLES)) {
    const role = await prisma.role.upsert({
      where: { name },
      update: {},
      create: { name, description: roleDescription(name) },
    });
    const permissionIds = allPermissions
      .filter((p) => perms.includes(p.code))
      .map((p) => p.id);
    // sync role_permissions (upsert — preserves manual assignments for built-in roles)
    for (const permissionId of permissionIds) {
      await prisma.rolePermission.upsert({
        where: { roleId_permissionId: { roleId: role.id, permissionId } },
        update: {},
        create: { roleId: role.id, permissionId },
      });
    }
  }

  // Super admin user
  const adminEmail = "admin@docs.local";
  const passwordHash = await bcrypt.hash("Admin@123456", 10);
  const admin = await prisma.user.upsert({
    where: { email: adminEmail },
    update: {},
    create: { fullName: "مدير النظام", email: adminEmail, passwordHash, phone: "" },
  });
  const superRole = await prisma.role.findUnique({ where: { name: "super_admin" } });
  if (superRole) {
    await prisma.userRole.upsert({
      where: { userId_roleId: { userId: admin.id, roleId: superRole.id } },
      update: {},
      create: { userId: admin.id, roleId: superRole.id },
    });
  }

  // Document types
  for (const d of DOCUMENT_TYPES) {
    await prisma.documentType.upsert({
      where: { code: d.code },
      update: {},
      create: d,
    });
  }

  // Settings
  for (const s of SETTINGS) {
    await prisma.setting.upsert({
      where: { key: s.key },
      update: { value: s.value, description: s.description },
      create: s,
    });
  }

  console.log("Seeding complete.");
  console.log(`Admin user created: ${adminEmail} / Admin@123456`);
}

function roleDescription(name: string): string {
  switch (name) {
    case "super_admin": return "صلاحيات كاملة على النظام";
    case "admin": return "إدارة البيانات والإعدادات";
    case "manager": return "إدارة العمالة والمستندات";
    case "viewer": return "قراءة فقط";
    default: return name;
  }
}

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