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

const prisma = new PrismaClient();

async function main() {
  console.log('🌱 Iniciando seed de la base de datos...');

  // Crear la Escuela Lobezno
  const escuela = await prisma.escuela.upsert({
    where: { id: 'lobezno-school' },
    update: {},
    create: {
      id: 'lobezno-school',
      nombre: 'Escuela de Fútbol Lobezno',
      direccionCalle: 'Av. Principal',
      direccionNumero: '1234',
      direccionComuna: 'Las Condes',
      direccionRegion: 'Metropolitana',
      telefono: '+56912345678',
      email: 'contacto@lobezno.cl',
      fechaCreacion: new Date(),
      activa: true,
      mesesActivos: ['3', '4', '5', '6', '7', '8', '9', '10', '11'],
      mesesInactivos: ['12', '1', '2'],
      categorias: ['2010', '2011', '2012', '2013', '2014', '2015', '2016'],
      modalidadesPago: ['MATRICULA', 'POR_CLASE', 'MENSUAL', 'SEMESTRAL']
    }
  });

  // Hash para contraseñas
  const hashPassword = async (password: string) => {
    return await bcrypt.hash(password, 10);
  };

  // Crear usuarios de prueba obligatorios (john@doe.com)
  const johnUser = await prisma.user.upsert({
    where: { email: 'john@doe.com' },
    update: {},
    create: {
      email: 'john@doe.com',
      name: 'John Doe',
      password: await hashPassword('johndoe123'),
      rut: '12345678-9',
      rol: 'COORDINADOR',
      escuelaId: escuela.id,
      activo: true
    }
  });

  // Crear usuario coordinador en el sistema interno
  const coordinadorUsuario = await prisma.usuario.upsert({
    where: { rut: '12345678-9' },
    update: {},
    create: {
      escuelaId: escuela.id,
      rut: '12345678-9',
      nombres: 'John',
      apellidos: 'Doe',
      nombreCorto: 'John Doe',
      fechaNacimiento: new Date('1980-05-15'),
      telefono: ['+56912345678'],
      email: 'john@doe.com',
      direccionCalle: 'Av. Principal',
      direccionNumero: '1234',
      direccionComuna: 'Las Condes',
      direccionRegion: 'Metropolitana',
      rol: 'COORDINADOR',
      clave: await hashPassword('johndoe123'),
      activo: true,
      fechaIngreso: new Date()
    }
  });

  // Crear coordinador adicional
  const coordinadorAdmin = await prisma.user.upsert({
    where: { email: 'admin@lobezno.cl' },
    update: {},
    create: {
      email: 'admin@lobezno.cl',
      name: 'Administrador Lobezno',
      password: await hashPassword('admin123'),
      rut: '11111111-1',
      rol: 'COORDINADOR',
      escuelaId: escuela.id,
      activo: true
    }
  });

  const adminUsuario = await prisma.usuario.upsert({
    where: { rut: '11111111-1' },
    update: {},
    create: {
      escuelaId: escuela.id,
      rut: '11111111-1',
      nombres: 'Administrador',
      apellidos: 'Lobezno',
      nombreCorto: 'Admin Lobezno',
      fechaNacimiento: new Date('1975-03-10'),
      telefono: ['+56987654321'],
      email: 'admin@lobezno.cl',
      direccionCalle: 'Av. Principal',
      direccionNumero: '1234',
      direccionComuna: 'Las Condes',
      direccionRegion: 'Metropolitana',
      rol: 'COORDINADOR',
      clave: await hashPassword('admin123'),
      activo: true,
      fechaIngreso: new Date()
    }
  });

  // Crear profesor de ejemplo
  const profesorUser = await prisma.user.upsert({
    where: { email: 'profesor@lobezno.cl' },
    update: {},
    create: {
      email: 'profesor@lobezno.cl',
      name: 'Carlos Profesor',
      password: await hashPassword('profesor123'),
      rut: '22222222-2',
      rol: 'PROFESOR',
      escuelaId: escuela.id,
      activo: true
    }
  });

  const profesorUsuario = await prisma.usuario.upsert({
    where: { rut: '22222222-2' },
    update: {},
    create: {
      escuelaId: escuela.id,
      rut: '22222222-2',
      nombres: 'Carlos',
      apellidos: 'Profesor',
      nombreCorto: 'Carlos Profesor',
      fechaNacimiento: new Date('1985-08-20'),
      telefono: ['+56955555555'],
      email: 'profesor@lobezno.cl',
      direccionCalle: 'Calle Los Profesores',
      direccionNumero: '567',
      direccionComuna: 'Providencia',
      direccionRegion: 'Metropolitana',
      rol: 'PROFESOR',
      clave: await hashPassword('profesor123'),
      activo: true,
      fechaIngreso: new Date()
    }
  });

  // Crear registro de profesor
  const profesor = await prisma.profesor.upsert({
    where: { usuarioId: profesorUsuario.id },
    update: {},
    create: {
      usuarioId: profesorUsuario.id,
      categoriasACargo: ['2012', '2013'],
      titulos: ['Técnico en Fútbol'],
      contactoEmergenciaNombre: 'María Profesor',
      contactoEmergenciaTelefono: '+56944444444',
      centroSaludNombre: 'Hospital UC',
      centroSaludUbicacion: 'https://maps.google.com/?q=Hospital+UC',
      asistenciaEntrenamientos: 45,
      asistenciaAmistosos: 12,
      asistenciaCampeonatos: 8
    }
  });

  // Crear apoderado de ejemplo
  const apoderado = await prisma.apoderado.upsert({
    where: { rut: '44444444-4' },
    update: {},
    create: {
      nombres: 'Pedro',
      apellidos: 'González',
      rut: '44444444-4',
      fechaNacimiento: new Date('1980-12-05'),
      direccionCalle: 'Av. Los Padres',
      direccionNumero: '890',
      direccionComuna: 'Ñuñoa',
      direccionRegion: 'Metropolitana',
      telefono: ['+56933333333'],
      email: ['pedro.gonzalez@email.com'],
      relacionConAlumno: 'Padre',
      otroContactoNombre: 'Ana González',
      otroContactoTelefono: '+56922222222'
    }
  });

  // Crear usuario alumno
  const alumnoUser = await prisma.user.upsert({
    where: { email: 'alumno@lobezno.cl' },
    update: {},
    create: {
      email: 'alumno@lobezno.cl',
      name: 'Matías González',
      password: await hashPassword('alumno123'),
      rut: '33333333-3',
      rol: 'ALUMNO',
      escuelaId: escuela.id,
      activo: true
    }
  });

  const alumnoUsuario = await prisma.usuario.upsert({
    where: { rut: '33333333-3' },
    update: {},
    create: {
      escuelaId: escuela.id,
      rut: '33333333-3',
      nombres: 'Matías',
      apellidos: 'González',
      nombreCorto: 'Matías González',
      fechaNacimiento: new Date('2012-06-15'),
      telefono: ['+56933333333'],
      email: 'alumno@lobezno.cl',
      direccionCalle: 'Av. Los Padres',
      direccionNumero: '890',
      direccionComuna: 'Ñuñoa',
      direccionRegion: 'Metropolitana',
      rol: 'ALUMNO',
      clave: await hashPassword('alumno123'),
      activo: true,
      fechaIngreso: new Date()
    }
  });

  // Crear registro de alumno
  const alumno = await prisma.alumno.upsert({
    where: { usuarioId: alumnoUsuario.id },
    update: {},
    create: {
      usuarioId: alumnoUsuario.id,
      apodo: 'Mati',
      categoria: '2012',
      apoderadoId: apoderado.id,
      peso: 45.5,
      altura: 1.50,
      piernaHabil: 'DERECHO',
      tallaCamiseta: 'S',
      tallaPantalon: 'S',
      largoPie: 24.0,
      posicionPrincipal: 'Delantero',
      posicionesSecundarias: ['Mediocampista'],
      modalidadesFutbol11: ['Delantero'],
      modalidadesFutbol9: ['Delantero'],
      modalidadesFutbol7: ['Delantero'],
      modalidadesFutbol5: ['Delantero'],
      centroSaludNombre: 'Clínica Santa María',
      centroSaludUbicacion: 'https://maps.google.com/?q=Clinica+Santa+Maria',
      seguroEscolar: true,
      modalidadPago: 'MENSUAL',
      estadoPagoMatricula: 'SIN_DEUDA',
      puntajeDeportivo: 3.5
    }
  });

  // Crear evento de ejemplo
  const evento = await prisma.evento.create({
    data: {
      escuelaId: escuela.id,
      tipo: 'ENTRENAMIENTO',
      descripcion: 'Entrenamiento Categoría 2012',
      fecha: new Date(Date.now() + 7 * 24 * 60 * 60 * 1000), // Una semana desde hoy
      hora: '16:00',
      lugar: 'Cancha Principal Lobezno',
      categorias: ['2012'],
      tipoCancha: 'COMPLETA',
      jugadoresPorLado: 11,
      numeroEquipos: 2,
      creadorId: coordinadorUsuario.id,
      estado: 'PROGRAMADO'
    }
  });

  // Crear evaluación deportiva de ejemplo
  const evaluacionDeportiva = await prisma.evaluacionDeportiva.create({
    data: {
      alumnoId: alumno.id,
      evaluadorId: profesorUsuario.id,
      fecha: new Date(),
      tecnica: 4.0,
      fuerza: 3.5,
      ataque: 4.2,
      defensa: 3.0,
      resistencia: 3.8,
      velocidad: 4.1,
      puntajeTotal: 3.8,
      posicionesPreferentes: ['Delantero'],
      observaciones: 'Buen jugador con potencial ofensivo'
    }
  });

  // Crear objetivo individual de ejemplo
  const objetivo = await prisma.objetivosIndividuales.create({
    data: {
      alumnoId: alumno.id,
      profesorId: profesorUsuario.id,
      tipo: 'TECNICO',
      objetivoFinal: 'Mejorar precisión en pases largos',
      objetivoInicial: 'Practicar pases cortos con precisión',
      objetivosIntermedios: [
        'Aumentar distancia gradualmente',
        'Practicar con presión defensiva'
      ],
      progreso: 25
    }
  });

  console.log('✅ Seed completado exitosamente!');
  console.log('📊 Datos creados:');
  console.log(`   - Escuela: ${escuela.nombre}`);
  console.log(`   - Usuarios: 4 (Coordinadores, Profesor, Alumno)`);
  console.log(`   - Apoderado: ${apoderado.nombres} ${apoderado.apellidos}`);
  console.log(`   - Alumno: ${alumno.usuarioId ? 'Matías González' : 'Error'}`);
  console.log(`   - Evento: ${evento.descripcion}`);
  console.log(`   - Evaluación deportiva y objetivo individual creados`);
  console.log('');
  console.log('🔐 Credenciales de acceso:');
  console.log('   Coordinador: john@doe.com / johndoe123');
  console.log('   Admin: admin@lobezno.cl / admin123');
  console.log('   Profesor: profesor@lobezno.cl / profesor123');
  console.log('   Alumno: alumno@lobezno.cl / alumno123');
}

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