const { PrismaClient } = require('@prisma/client');
const bcrypt = require('bcryptjs');

const prisma = new PrismaClient();

async function main() {
  // Users
  const passwordHash = await bcrypt.hash('Admin123!', 12);

  const superAdmin = await prisma.user.upsert({
    where: { email: 'admin@arpm.com' },
    update: {},
    create: {
      email: 'admin@arpm.com',
      passwordHash,
      firstName: 'Admin',
      lastName: 'Sistema',
      role: 'SUPER_ADMIN',
    },
  });

  const director = await prisma.user.upsert({
    where: { email: 'director@arpm.com' },
    update: {},
    create: {
      email: 'director@arpm.com',
      passwordHash,
      firstName: 'Carlos',
      lastName: 'Ramírez',
      role: 'DIRECTOR',
      department: 'Dirección',
      jobTitle: 'Director General',
    },
  });

  const gerente = await prisma.user.upsert({
    where: { email: 'gerente@arpm.com' },
    update: {},
    create: {
      email: 'gerente@arpm.com',
      passwordHash,
      firstName: 'Ana',
      lastName: 'Torres',
      role: 'GERENTE',
      department: 'Proyectos',
      jobTitle: 'Gerente de Proyectos',
    },
  });

  const colaborador = await prisma.user.upsert({
    where: { email: 'colaborador@arpm.com' },
    update: {},
    create: {
      email: 'colaborador@arpm.com',
      passwordHash,
      firstName: 'Luis',
      lastName: 'Mendoza',
      role: 'COLABORADOR',
      department: 'Ingeniería',
      jobTitle: 'Desarrollador Senior',
    },
  });

  // Projects
  const proj1 = await prisma.project.upsert({
    where: { code: 'PRY-2026-001' },
    update: {},
    create: {
      code: 'PRY-2026-001',
      name: 'Construcción Torre Corporativa Norte',
      description: 'Proyecto de construcción de edificio de 20 pisos para uso corporativo',
      type: 'Construcción',
      category: 'Infraestructura',
      client: 'Inmobiliaria Del Valle',
      startDate: new Date('2026-01-15'),
      plannedEndDate: new Date('2027-12-31'),
      budget: 15000000.00,
      priority: 'ALTO',
      status: 'ACTIVO',
      currentPhase: 'Cimentación',
      methodology: 'PMI',
      ragStatus: 'VERDE',
      progressPct: 12.5,
      tags: ['construcción', 'corporativo', 'norte'],
    },
  });

  const proj2 = await prisma.project.upsert({
    where: { code: 'PRY-2026-002' },
    update: {},
    create: {
      code: 'PRY-2026-002',
      name: 'Álbum Musical "Horizontes"',
      description: 'Producción completa del cuarto álbum del artista Marco Solís',
      type: 'Producción Musical',
      category: 'Entretenimiento',
      client: 'Sony Music Latin',
      startDate: new Date('2026-03-01'),
      plannedEndDate: new Date('2026-09-30'),
      budget: 250000.00,
      priority: 'MEDIO',
      status: 'ACTIVO',
      currentPhase: 'Grabación',
      methodology: 'Agile',
      ragStatus: 'AMARILLO',
      progressPct: 35.0,
      tags: ['música', 'álbum', 'producción'],
    },
  });

  const proj3 = await prisma.project.upsert({
    where: { code: 'PRY-2026-003' },
    update: {},
    create: {
      code: 'PRY-2026-003',
      name: 'Implementación ERP Empresarial',
      description: 'Migración y modernización del sistema ERP corporativo',
      type: 'Software',
      category: 'Tecnología',
      client: 'Grupo Empresarial XYZ',
      startDate: new Date('2026-02-01'),
      plannedEndDate: new Date('2026-11-30'),
      budget: 800000.00,
      priority: 'CRITICO',
      status: 'EN_RIESGO',
      currentPhase: 'Desarrollo',
      methodology: 'Scrum',
      ragStatus: 'ROJO',
      progressPct: 48.0,
      tags: ['erp', 'software', 'migración'],
    },
  });

  // Project members
  for (const proj of [proj1, proj2, proj3]) {
    await prisma.projectMember.upsert({
      where: { projectId_userId: { projectId: proj.id, userId: gerente.id } },
      update: {},
      create: { projectId: proj.id, userId: gerente.id, role: 'GERENTE' },
    });
    await prisma.projectMember.upsert({
      where: { projectId_userId: { projectId: proj.id, userId: colaborador.id } },
      update: {},
      create: { projectId: proj.id, userId: colaborador.id, role: 'COLABORADOR' },
    });
  }

  // Sample tasks for ERP project
  const task1 = await prisma.task.create({
    data: {
      projectId: proj3.id,
      title: 'Análisis de requerimientos',
      description: 'Levantamiento y documentación de todos los requerimientos del negocio',
      createdById: gerente.id,
      assigneeId: colaborador.id,
      status: 'COMPLETADA',
      priority: 'CRITICO',
      estimatedHours: 80,
      actualHours: 92,
      progressPct: 100,
      startDate: new Date('2026-02-01'),
      dueDate: new Date('2026-02-28'),
    },
  });

  await prisma.task.create({
    data: {
      projectId: proj3.id,
      parentId: task1.id,
      title: 'Entrevistas con stakeholders',
      createdById: gerente.id,
      assigneeId: colaborador.id,
      status: 'COMPLETADA',
      priority: 'ALTO',
      estimatedHours: 20,
      progressPct: 100,
    },
  });

  await prisma.task.create({
    data: {
      projectId: proj3.id,
      title: 'Desarrollo módulo de inventarios',
      description: 'Implementación del módulo de gestión de inventarios con integración WMS',
      createdById: gerente.id,
      assigneeId: colaborador.id,
      status: 'EN_PROCESO',
      priority: 'CRITICO',
      estimatedHours: 200,
      actualHours: 120,
      progressPct: 55,
      startDate: new Date('2026-03-15'),
      dueDate: new Date('2026-06-30'),
    },
  });

  console.log('Seed completado:');
  console.log('  Usuarios: admin@arpm.com, director@arpm.com, gerente@arpm.com, colaborador@arpm.com');
  console.log('  Password para todos: Admin123!');
  console.log('  Proyectos: PRY-2026-001, PRY-2026-002, PRY-2026-003');
}

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