import { PrismaClient } from '@prisma/client';

const prisma = new PrismaClient();

// Recursos disponibles en la empresa
const resources = [
  { id: 'aton1', name: 'Aton 1' },
  { id: 'aton2', name: 'Aton 2' },
  { id: 'aton3', name: 'Aton 3' },
  { id: 'cowork-1', name: 'Espacio Coworking 1' },
  { id: 'auditorio', name: 'Auditorio Principal' },
];

// Autores del equipo
const authors = [
  'Jessica Orozco',
  'Carlos Méndez',
  'Ana Torres',
  'Luis Herrera',
  'María López',
];

// Slots de horario (horas laborales)
const slots = [
  { start: '09:00', end: '10:00' },
  { start: '10:00', end: '11:00' },
  { start: '11:00', end: '12:00' },
  { start: '14:00', end: '15:00' },
  { start: '15:00', end: '16:00' },
  { start: '16:00', end: '17:00' },
  { start: '17:00', end: '18:00' },
];

// Genera fechas futuras en julio 2026 (días hábiles: lunes a viernes)
function getFutureDates(): string[] {
  const dates: string[] = [];
  // Desde mañana (02/07) hasta fin de julio (31/07)
  const start = new Date('2026-07-02');
  const end = new Date('2026-07-31');

  for (let d = new Date(start); d <= end; d.setDate(d.getDate() + 1)) {
    const dayOfWeek = d.getDay();
    if (dayOfWeek !== 0 && dayOfWeek !== 6) {
      // excluir sábado y domingo
      dates.push(d.toISOString().split('T')[0]);
    }
  }
  return dates;
}

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

function getRandomNotes(): string | undefined {
  const notes = [
    'Reunión de planificación sprint',
    'Demo con cliente',
    'Sesión de diseño',
    'Revisión de métricas',
    'Workshop de onboarding',
    'Retrospectiva del equipo',
    undefined,
    undefined, // 2/8 chance de sin notas
  ];
  return getRandom(notes);
}

async function main() {
  console.log('🌱 Iniciando seed de reservas futuras en Supabase...\n');

  const dates = getFutureDates();
  console.log(`📅 Fechas a cubrir: ${dates[0]} → ${dates[dates.length - 1]} (${dates.length} días hábiles)`);

  let created = 0;
  let skipped = 0;

  for (const date of dates) {
    // 2-4 reservas por día para simular uso real
    const reservasDelDia = Math.floor(Math.random() * 3) + 2;

    // Shuffle slots para no repetir
    const shuffledSlots = [...slots].sort(() => Math.random() - 0.5);

    for (let i = 0; i < reservasDelDia; i++) {
      const slot = shuffledSlots[i];
      const resource = getRandom(resources);
      const author = getRandom(authors);

      try {
        await prisma.reserva.create({
          data: {
            resourceId: resource.id,
            resourceName: resource.name,
            date,
            startTime: slot.start,
            endTime: slot.end,
            author,
            notes: getRandomNotes(),
          },
        });
        created++;
        console.log(`  ✅ ${date} ${slot.start}-${slot.end} | ${resource.name} | ${author}`);
      } catch (e: any) {
        // Conflicto de unique constraint: mismo recurso + fecha + hora
        if (e.code === 'P2002') {
          skipped++;
        } else {
          console.error(`  ❌ Error inesperado: ${e.message}`);
        }
      }
    }
  }

  console.log(`\n📊 Resultado:`);
  console.log(`  ✅ Creadas: ${created} reservas`);
  console.log(`  ⏭️  Omitidas por conflicto: ${skipped}`);
  console.log(`\n🎉 Seed completado. Datos disponibles en Supabase.`);
}

main()
  .catch((e) => {
    console.error('❌ Error en el seed:', e);
    process.exit(1);
  })
  .finally(async () => {
    await prisma.$disconnect();
  });
