import { PrismaClient, UserRole, ReviewSentiment, ReviewStatus } from '@prisma/client'
import bcrypt from 'bcryptjs'

const prisma = new PrismaClient()

const SERVICE_TYPES = [
  'Limpieza de oficinas',
  'Limpieza de baños',
  'Limpieza de domicilios',
  'Limpieza de Cocina',
  'Lavado de Alfombras',
  'Asistencia del personal Totes',
  'Imagen del personal',
  'Provisión de insumos',
]

// SubTypes for service types that require clarification
const SUB_TYPES_BY_SERVICE: Record<string, string[]> = {
  'Imagen del personal': ['Uniforme sucio', 'Falta de uniforme', 'Presentación inadecuada', 'Atraso'],
  'Asistencia del personal Totes': ['Falta', 'Atraso', 'Incumplimiento', 'Negligencia'],
}

function randomItem<T>(arr: T[]): T {
  return arr[Math.floor(Math.random() * arr.length)]
}

function randomInt(min: number, max: number): number {
  return Math.floor(Math.random() * (max - min + 1)) + min
}

function daysAgo(days: number): Date {
  const d = new Date()
  d.setDate(d.getDate() - days)
  return d
}

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

  // Clean existing data
  await prisma.notification.deleteMany()
  await prisma.supervisorResponse.deleteMany()
  await prisma.reviewPhoto.deleteMany()
  await prisma.review.deleteMany()
  await prisma.user.deleteMany()

  const passwordHash = await bcrypt.hash('password123', 12)
  const adminPasswordHash = await bcrypt.hash('%%S0p0rt326', 12)

  // ════════════════════════════════════════════════════════
  // ── Create Admin ──
  // ════════════════════════════════════════════════════════
  const admin = await prisma.user.create({
    data: {
      email: 'admin@totes.com.bo',
      name: 'Administrador Totes',
      phone: '+591 2 2000000',
      passwordHash: adminPasswordHash,
      role: UserRole.ADMIN,
      isActive: true,
    },
  })
  console.log(`  ✅ Admin: ${admin.name} (${admin.email})`)

  // ════════════════════════════════════════════════════════
  // ── Create Managers (2) ──
  // ════════════════════════════════════════════════════════
  const managerData = [
    { email: 'gerencia@totes.com.bo', name: 'Carlos Mendoza', phone: '+591 2 2123456' },
    { email: 'gerencia2@totes.com.bo', name: 'María García', phone: '+591 2 2123457' },
  ]

  const managers = []
  for (const data of managerData) {
    const manager = await prisma.user.create({
      data: {
        email: data.email,
        name: data.name,
        phone: data.phone,
        passwordHash,
        role: UserRole.MANAGER,
        isActive: true,
      },
    })
    managers.push(manager)
    console.log(`  ✅ Manager: ${manager.name} (${manager.email})`)
  }

  // ════════════════════════════════════════════════════════
  // ── Create Supervisors (8) ──
  // ════════════════════════════════════════════════════════
  const supervisorData = [
    { email: 'supervisor1@totes.com.bo', name: 'Ana Rodríguez', phone: '+591 2 2234001' },
    { email: 'supervisor2@totes.com.bo', name: 'Roberto López', phone: '+591 2 2234002' },
    { email: 'supervisor3@totes.com.bo', name: 'Laura Martínez', phone: '+591 2 2234003' },
    { email: 'supervisor4@totes.com.bo', name: 'Luis Fernández', phone: '+591 2 2234004' },
    { email: 'supervisor5@totes.com.bo', name: 'Carmen Delgado', phone: '+591 2 2234005' },
    { email: 'supervisor6@totes.com.bo', name: 'Pedro Jiménez', phone: '+591 2 2234006' },
    { email: 'supervisor7@totes.com.bo', name: 'Sofía Ramírez', phone: '+591 2 2234007' },
    { email: 'supervisor8@totes.com.bo', name: 'Diego Castro', phone: '+591 2 2234008' },
  ]

  const supervisors = []
  for (const data of supervisorData) {
    const supervisor = await prisma.user.create({
      data: {
        email: data.email,
        name: data.name,
        phone: data.phone,
        passwordHash,
        role: UserRole.SUPERVISOR,
        isActive: true,
      },
    })
    supervisors.push(supervisor)
    console.log(`  ✅ Supervisor: ${supervisor.name} (${supervisor.email})`)
  }

  // ════════════════════════════════════════════════════════
  // ── Create Customers (16) — 2 per supervisor round-robin ──
  // ════════════════════════════════════════════════════════
  const customerData = [
    { name: 'Juan Pérez', company: 'Empresa Alpha S.R.L.', phone: '+591 2 2345001' },
    { name: 'Patricia Hernández', company: 'Servicios Beta Ltda.', phone: '+591 2 2345002' },
    { name: 'Miguel Torres', company: 'Comercial Gamma S.A.', phone: '+591 2 2345003' },
    { name: 'Carmen Sánchez', company: 'Industrias Delta S.R.L.', phone: '+591 2 2345004' },
    { name: 'Fernando Díaz', company: 'Grupo Épsilon Ltda.', phone: '+591 2 2345005' },
    { name: 'Rosa Gómez', company: 'Distribuidora Zeta S.A.', phone: '+591 2 2345006' },
    { name: 'Alejandro Ruiz', company: 'Negocios Eta S.R.L.', phone: '+591 2 2345007' },
    { name: 'Isabel Flores', company: 'Consultora Theta Ltda.', phone: '+591 2 2345008' },
    { name: 'Diego Vargas', company: 'Construcciones Iota S.A.', phone: '+591 2 2345009' },
    { name: 'Lucía Morales', company: 'Alimentos Kappa S.R.L.', phone: '+591 2 2345010' },
    { name: 'Andrés Mendoza', company: 'Tecnologías Lambda Ltda.', phone: '+591 2 2345011' },
    { name: 'Gabriela Rojas', company: 'Importaciones Mu S.A.', phone: '+591 2 2345012' },
    { name: 'Ricardo Salazar', company: 'Financiera Nu S.R.L.', phone: '+591 2 2345013' },
    { name: 'Verónica Paredes', company: 'Logística Xi Ltda.', phone: '+591 2 2345014' },
    { name: 'Eduardo Fuentes', company: 'Farmacéutica Omicron S.A.', phone: '+591 2 2345015' },
    { name: 'Adriana Paz', company: 'Textiles Pi S.R.L.', phone: '+591 2 2345016' },
  ]

  const customers = []
  for (let i = 0; i < customerData.length; i++) {
    const data = customerData[i]
    // Assign 2 customers per supervisor round-robin
    const assignedSupervisor = supervisors[i % supervisors.length]
    const customer = await prisma.user.create({
      data: {
        email: `cliente${i + 1}@${data.company.split(' ')[0].toLowerCase()}.com.bo`,
        name: data.name,
        company: data.company,
        phone: data.phone,
        passwordHash,
        role: UserRole.CUSTOMER,
        isActive: true,
        assignedById: assignedSupervisor.id,
      },
    })
    customers.push(customer)
    console.log(`  ✅ Customer: ${customer.name} - ${customer.company} → Supervisor: ${assignedSupervisor.name}`)
  }

  // ════════════════════════════════════════════════════════
  // ── Create Positive Reviews (15) ──
  // ════════════════════════════════════════════════════════
  const positiveReviewData = [
    {
      title: 'Excelente limpieza de oficinas',
      content: 'El equipo de limpieza llegó puntual y dejó nuestras oficinas impecables. Muy profesionales y amables en todo momento.',
      rating: 5,
      serviceType: 'Limpieza de oficinas',
      subType: null,
    },
    {
      title: 'Limpieza de baños impecable',
      content: 'Los baños quedaron como nuevos. El servicio fue rápido y sin contratiempos. El personal explicó todo con detalle.',
      rating: 5,
      serviceType: 'Limpieza de baños',
      subType: null,
    },
    {
      title: 'Limpieza de domicilios eficiente',
      content: 'Resolvieron la limpieza completa de mi domicilio en menos de lo esperado. La atención fue excelente y el resultado impecable.',
      rating: 4,
      serviceType: 'Limpieza de domicilios',
      subType: null,
    },
    {
      title: 'Lavado de Alfombras de gran calidad',
      content: 'El lavado de alfombras nos ayudó a recuperar unas alfombras que parecían irrecuperables. Muy satisfechos con los resultados.',
      rating: 5,
      serviceType: 'Lavado de Alfombras',
      subType: null,
    },
    {
      title: 'Asistencia del personal Totes muy útil',
      content: 'El personal de Totes fue completo y práctico. Tienen mucha experiencia y saben atender con profesionalismo.',
      rating: 4,
      serviceType: 'Asistencia del personal Totes',
      subType: 'Cumplimiento',
    },
    {
      title: 'Provisión de insumos rápida y efectiva',
      content: 'La provisión de insumos llegó a tiempo y con todo lo solicitado. El servicio fue impecable desde la solicitud hasta la entrega.',
      rating: 5,
      serviceType: 'Provisión de insumos',
      subType: null,
    },
    {
      title: 'Buena limpieza de Cocina',
      content: 'La limpieza de cocina se realizó según lo programado. Todo quedó funcionando perfectamente y sin grasa.',
      rating: 4,
      serviceType: 'Limpieza de Cocina',
      subType: null,
    },
    {
      title: 'Imagen del personal destacada',
      content: 'El personal siempre se presenta con uniforme limpio y buena presentación. Refleja muy bien la imagen de la empresa.',
      rating: 5,
      serviceType: 'Imagen del personal',
      subType: 'Presentación adecuada',
    },
    {
      title: 'Limpieza de baños excelente',
      content: 'El equipo siempre está disponible y deja los baños impecables con rapidez y profesionalismo.',
      rating: 5,
      serviceType: 'Limpieza de baños',
      subType: null,
    },
    {
      title: 'Asistencia del personal Totes acertada',
      content: 'El personal entendió nuestras necesidades y propuso soluciones que realmente funcionaron. Recomiendo sus servicios.',
      rating: 4,
      serviceType: 'Asistencia del personal Totes',
      subType: 'Cumplimiento',
    },
    {
      title: 'Lavado de Alfombras interactivo',
      content: 'El lavado de alfombras fue dinámico y los resultados superaron nuestras expectativas. Muy recomendado.',
      rating: 5,
      serviceType: 'Lavado de Alfombras',
      subType: null,
    },
    {
      title: 'Provisión de insumos garantizada',
      content: 'Los insumos llegaron con garantía de calidad y hasta ahora todo funciona perfectamente. Muy tranquilizadores.',
      rating: 3,
      serviceType: 'Provisión de insumos',
      subType: null,
    },
    {
      title: 'Imagen del personal profesional',
      content: 'Muy buena impresión del personal asignado. Uniforme impecable, puntualidad y trato cordial en todo momento.',
      rating: 4,
      serviceType: 'Imagen del personal',
      subType: 'Presentación adecuada',
    },
    {
      title: 'Servicio de limpieza de domicilios confiable',
      content: 'Llevamos 6 meses con el servicio de limpieza domiciliaria y no hemos tenido ningún problema. Muy confiables.',
      rating: 4,
      serviceType: 'Limpieza de domicilios',
      subType: null,
    },
    {
      title: 'Excelente limpieza de Cocina',
      content: 'La limpieza de cocina fue impecable. Cero grasa y olores desde que se realizó el servicio.',
      rating: 5,
      serviceType: 'Limpieza de Cocina',
      subType: null,
    },
  ]

  let reviewCounter = 0
  const positiveReviews = []
  for (let i = 0; i < positiveReviewData.length; i++) {
    const data = positiveReviewData[i]
    const customer = customers[i % customers.length]
    const serviceDate = daysAgo(randomInt(1, 90))
    reviewCounter++
    const reviewCode = `REV-2025-${reviewCounter.toString().padStart(5, '0')}`

    const review = await prisma.review.create({
      data: {
        reviewCode,
        customerId: customer.id,
        rating: data.rating,
        title: data.title,
        content: data.content,
        sentiment: ReviewSentiment.POSITIVE,
        status: ReviewStatus.RESOLVED,
        serviceDate,
        serviceType: data.serviceType,
        subType: data.subType,
        assignedToId: customer.assignedById ?? null,
        notifiedAt: daysAgo(randomInt(0, 5)),
        resolvedAt: daysAgo(randomInt(0, 3)),
      },
    })
    positiveReviews.push(review)
    console.log(`  ✅ Positive Review: ${review.reviewCode} - ${review.title}`)
  }

  // ════════════════════════════════════════════════════════
  // ── Create Negative Reviews (8) ──
  // ════════════════════════════════════════════════════════
  const negativeReviewData = [
    {
      title: 'Limpieza de oficinas deficiente',
      content: 'El personal de limpieza llegó tarde y no limpió adecuadamente. Tuve que solicitar una segunda visita para que se corrigiera el trabajo inicial.',
      rating: 1,
      serviceType: 'Limpieza de oficinas',
      subType: null,
      status: ReviewStatus.PENDING,
    },
    {
      title: 'Uniforme sucio del personal asignado',
      content: 'El personal que acudió a nuestra oficina presentaba un uniforme manchado y descuidado. Esto da una mala imagen a nuestra empresa y a la de ustedes.',
      rating: 2,
      serviceType: 'Imagen del personal',
      subType: 'Uniforme sucio',
      status: ReviewStatus.ACKNOWLEDGED,
    },
    {
      title: 'Asistencia del personal Totes sin resultados',
      content: 'La asistencia del personal Totes fue deficiente y no se ajustó a nuestras necesidades. No vimos ninguna mejora después de su intervención.',
      rating: 2,
      serviceType: 'Asistencia del personal Totes',
      subType: 'Incumplimiento',
      status: ReviewStatus.ACKNOWLEDGED,
    },
    {
      title: 'Falta de uniforme en el personal',
      content: 'El personal asignado no portaba el uniforme reglamentario de Totes. Se presentó con ropa de calle, lo cual es inaceptable para un servicio profesional.',
      rating: 1,
      serviceType: 'Imagen del personal',
      subType: 'Falta de uniforme',
      status: ReviewStatus.PENDING,
    },
    {
      title: 'Asistencia del personal Totes con atraso',
      content: 'El personal de Totes llegó con más de una hora de retraso a la asignación. El atraso causó retrasos en nuestras operaciones del día.',
      rating: 1,
      serviceType: 'Asistencia del personal Totes',
      subType: 'Atraso',
      status: ReviewStatus.RESOLVED,
    },
    {
      title: 'Provisión de insumos sin garantía',
      content: 'Los insumos provistos eran de mala calidad y se agotaron rápidamente. No quisieron hacerse responsables y tuve que comprar nuevamente.',
      rating: 2,
      serviceType: 'Provisión de insumos',
      subType: null,
      status: ReviewStatus.PENDING,
    },
    {
      title: 'Asistencia del personal Totes negligente',
      content: 'El personal de Totes demostró negligencia en el cumplimiento de sus funciones. Dejaron tareas sin completar y no siguieron los protocolos establecidos.',
      rating: 1,
      serviceType: 'Asistencia del personal Totes',
      subType: 'Negligencia',
      status: ReviewStatus.ACKNOWLEDGED,
    },
    {
      title: 'Presentación inadecuada del personal',
      content: 'El personal presentaba una imagen descuidada: cabello despeinado, sin identification visible y actitud poco profesional. Necesitan mejorar la imagen de su personal.',
      rating: 2,
      serviceType: 'Imagen del personal',
      subType: 'Presentación inadecuada',
      status: ReviewStatus.RESOLVED,
    },
  ]

  const negativeReviews = []
  for (let i = 0; i < negativeReviewData.length; i++) {
    const data = negativeReviewData[i]
    const customer = customers[(i + 4) % customers.length]
    const serviceDate = daysAgo(randomInt(1, 30))
    reviewCounter++
    const reviewCode = `REV-2025-${reviewCounter.toString().padStart(5, '0')}`

    const assignedSupervisor = data.status !== ReviewStatus.PENDING
      ? supervisors[i % supervisors.length]
      : null

    const review = await prisma.review.create({
      data: {
        reviewCode,
        customerId: customer.id,
        rating: data.rating,
        title: data.title,
        content: data.content,
        sentiment: ReviewSentiment.NEGATIVE,
        status: data.status,
        serviceDate,
        serviceType: data.serviceType,
        subType: data.subType,
        assignedToId: assignedSupervisor?.id ?? null,
        notifiedAt: data.status !== ReviewStatus.PENDING ? daysAgo(randomInt(1, 5)) : null,
        resolvedAt: data.status === ReviewStatus.RESOLVED ? daysAgo(randomInt(0, 2)) : null,
      },
    })
    negativeReviews.push(review)
    console.log(`  ✅ Negative Review: ${review.reviewCode} - ${review.title} [${review.status}]${data.subType ? ` subType: ${data.subType}` : ''}`)
  }

  // ════════════════════════════════════════════════════════
  // ── Add Supervisor Responses to some reviews ──
  // ════════════════════════════════════════════════════════
  const reviewsWithResponses = [
    // Positive reviews
    { reviewIdx: 2, supervisorIdx: 0 },
    { reviewIdx: 5, supervisorIdx: 1 },
    { reviewIdx: 8, supervisorIdx: 2 },
    { reviewIdx: 12, supervisorIdx: 3 },
    // Negative reviews with ACKNOWLEDGED or RESOLVED status
    { reviewIdx: 1, supervisorIdx: 1, isNegative: true }, // Uniforme sucio (ACKNOWLEDGED)
    { reviewIdx: 2, supervisorIdx: 2, isNegative: true }, // Incumplimiento (ACKNOWLEDGED)
    { reviewIdx: 4, supervisorIdx: 4, isNegative: true }, // Atraso (RESOLVED)
    { reviewIdx: 6, supervisorIdx: 6, isNegative: true }, // Negligencia (ACKNOWLEDGED)
    { reviewIdx: 7, supervisorIdx: 7, isNegative: true }, // Presentación inadecuada (RESOLVED)
  ]

  const actionTakenOptions = [
    'Se contactó al cliente para coordinar visita de seguimiento',
    'Se asignó técnico especializado para revisión del servicio',
    'Se reprogramó el servicio con personal calificado',
    'Se realizó inspección adicional y se corrigió el problema',
    'Se ofreció compensación al cliente por los inconvenientes',
    'Se citó al personal para capacitación sobre imagen y presentación',
    'Se verificó el cumplimiento de los protocolos de uniforme',
  ]

  const internalNoteOptions = [
    'Cliente frecuente, priorizar resolución para mantener relación',
    'Segundo reporte del mismo tipo, revisar procedimiento interno',
    'Verificar calidad del servicio con el técnico asignado',
    'Coordinar con gerencia para posible descuento en próximo servicio',
    'Programar capacitación de personal sobre imagen corporativa',
    'Revisar stock de uniformes y asignar reposición inmediata',
  ]

  const responseToClientOptions = [
    'Estimado cliente, lamentamos los inconvenientes. Hemos tomado las medidas necesarias para corregir la situación y nos aseguraremos de que el próximo servicio cumpla con sus expectativas.',
    'Gracias por sus comentarios. Hemos reasignado un técnico con mayor experiencia para su caso y coordinaremos una visita a la brevedad.',
    'Apreciamos su retroalimentación. Hemos revisado nuestro proceso y tomado acciones correctivas. Le ofrecemos una compensación por los inconvenientes causados.',
    'Lamentamos la experiencia. Nuestro equipo ha corregido el problema y estamos implementando medidas para evitar que se repita. Gracias por su paciencia.',
    'Estimado cliente, hemos tomado nota de su observación sobre la imagen del personal. Se ha instruido al equipo sobre los estándares de presentación que deben cumplir.',
  ]

  for (const resp of reviewsWithResponses) {
    const review = resp.isNegative
      ? negativeReviews[resp.reviewIdx]
      : positiveReviews[resp.reviewIdx]
    if (!review) continue

    const supervisor = supervisors[resp.supervisorIdx]

    await prisma.supervisorResponse.create({
      data: {
        reviewId: review.id,
        supervisorId: supervisor.id,
        actionTaken: randomItem(actionTakenOptions),
        internalNote: randomItem(internalNoteOptions),
        responseToClient: randomItem(responseToClientOptions),
        createdAt: daysAgo(randomInt(0, 5)),
      },
    })
    console.log(`  ✅ Supervisor Response on: ${review.reviewCode} by ${supervisor.name}`)
  }

  // ════════════════════════════════════════════════════════
  // ── Add Photos to some reviews ──
  // ════════════════════════════════════════════════════════
  const reviewsWithPhotos = [
    { review: positiveReviews[0], count: 2 },
    { review: positiveReviews[5], count: 1 },
    { review: positiveReviews[9], count: 3 },
    { review: negativeReviews[0], count: 2 },
    { review: negativeReviews[1], count: 1 },
    { review: negativeReviews[7], count: 2 },
  ]

  for (const photoData of reviewsWithPhotos) {
    for (let p = 0; p < photoData.count; p++) {
      await prisma.reviewPhoto.create({
        data: {
          reviewId: photoData.review.id,
          storageKey: `reviews/${photoData.review.reviewCode}/photo-${p + 1}.jpg`,
          fileName: `foto_${p + 1}.jpg`,
          sizeBytes: randomInt(500000, 5000000),
          uploadedAt: daysAgo(randomInt(0, 10)),
        },
      })
    }
    console.log(`  ✅ Photos added to: ${photoData.review.reviewCode} (${photoData.count} photos)`)
  }

  // ════════════════════════════════════════════════════════
  // ── Create Notifications ──
  // ════════════════════════════════════════════════════════

  // Notifications for managers
  for (const manager of managers) {
    await prisma.notification.createMany({
      data: [
        {
          userId: manager.id,
          title: 'Nueva reseña negativa',
          message: 'Se ha recibido una reseña negativa que requiere atención inmediata.',
          type: 'NEGATIVE_REVIEW',
          reviewId: negativeReviews[0].id,
          isRead: false,
        },
        {
          userId: manager.id,
          title: 'Reporte semanal listo',
          message: 'El reporte semanal de satisfacción del cliente está disponible para revisión.',
          type: 'WEEKLY_REPORT',
          isRead: true,
        },
        {
          userId: manager.id,
          title: 'Escalamiento de caso',
          message: 'Un supervisor ha escalado un caso que requiere aprobación de gerencia.',
          type: 'ESCALATION',
          reviewId: negativeReviews[2].id,
          isRead: false,
        },
        {
          userId: manager.id,
          title: 'Problema de imagen del personal',
          message: 'Se reportó un problema con la imagen del personal asignado. Requiere revisión.',
          type: 'NEGATIVE_REVIEW',
          reviewId: negativeReviews[1].id,
          isRead: false,
        },
      ],
    })
    console.log(`  ✅ Notifications for manager: ${manager.name}`)
  }

  // Notifications for supervisors
  for (let i = 0; i < supervisors.length; i++) {
    const supervisor = supervisors[i]
    await prisma.notification.createMany({
      data: [
        {
          userId: supervisor.id,
          title: 'Nueva reseña asignada',
          message: 'Se te ha asignado una nueva reseña negativa para dar seguimiento.',
          type: 'NEGATIVE_REVIEW',
          reviewId: negativeReviews[i % negativeReviews.length].id,
          isRead: i === 0,
        },
        {
          userId: supervisor.id,
          title: 'Respuesta del cliente',
          message: 'El cliente ha respondido a tu mensaje de seguimiento.',
          type: 'RESPONSE_TO_CLIENT',
          reviewId: negativeReviews[(i + 1) % negativeReviews.length].id,
          isRead: false,
        },
        {
          userId: supervisor.id,
          title: 'Reseña positiva recibida',
          message: 'Uno de tus clientes ha dejado una reseña positiva.',
          type: 'POSITIVE_REVIEW',
          reviewId: positiveReviews[i % positiveReviews.length].id,
          isRead: true,
        },
      ],
    })
    console.log(`  ✅ Notifications for supervisor: ${supervisor.name}`)
  }

  // Notifications for customers
  for (let i = 0; i < customers.length; i++) {
    const customer = customers[i]
    const notificationData: Array<{
      title: string
      message: string
      type: string
      reviewId: string | null
      isRead: boolean
    }> = [
      {
        title: 'Tu reseña ha sido recibida',
        message: 'Gracias por tu opinión. Tu retroalimentación es muy importante para nosotros.',
        type: 'REVIEW_RECEIVED',
        reviewId: null,
        isRead: true,
      },
    ]

    // Some customers get response notifications
    if (i < 8) {
      notificationData.push({
        title: 'Respuesta a tu reseña',
        message: 'Un supervisor ha respondido a tu reseña. Revisa los detalles en tu panel.',
        type: 'RESPONSE_TO_CLIENT',
        reviewId: (i < 4 ? positiveReviews : negativeReviews)[i % (i < 4 ? positiveReviews.length : negativeReviews.length)].id,
        isRead: i < 3,
      })
    }

    // Some get positive review acknowledgment
    if (i >= 8 && i < 12) {
      notificationData.push({
        title: '¡Gracias por tu calificación!',
        message: 'Nos alegra saber que tuviste una buena experiencia. Seguiremos trabajando para mejorar.',
        type: 'POSITIVE_REVIEW',
        reviewId: positiveReviews[i % positiveReviews.length].id,
        isRead: false,
      })
    }

    await prisma.notification.createMany({
      data: notificationData.map((n) => ({
        userId: customer.id,
        title: n.title,
        message: n.message,
        type: n.type,
        reviewId: n.reviewId,
        isRead: n.isRead,
      })),
    })
    console.log(`  ✅ Notifications for customer: ${customer.name} (${customer.company})`)
  }

  console.log('\n🎉 Seed completed successfully!')
  console.log(`  👤 Managers: ${managers.length}`)
  console.log(`  👤 Supervisors: ${supervisors.length}`)
  console.log(`  👤 Customers: ${customers.length}`)
  console.log(`  📝 Positive Reviews: ${positiveReviews.length}`)
  console.log(`  📝 Negative Reviews: ${negativeReviews.length}`)
  console.log(`  📧 Notifications created for all roles`)
  console.log(`  🏢 Companies assigned to all customers`)
  console.log(`  📱 Bolivian phone format (+591) used for all users`)
}

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