import express from 'express';
const router = express.Router();
import { PrismaClient, Prisma } from '../../prisma/generated/client/index.js';
const prisma = new PrismaClient();

// GET all asistencias
router.get('/', async (req, res) => {
  try {
    const asistencias = await prisma.asistencia.findMany();
    res.json(asistencias);
  } catch (e) {
    console.error(e);
    res.status(500).json({ message: 'Error al obtener asistencias.' });
  }
});

// GET asistencia by ID
router.get('/:id', async (req, res) => {
  const { id } = req.params;
  try {
    const asistencia = await prisma.asistencia.findUnique({
      where: { id: parseInt(id) },
    });
    if (asistencia) {
      res.json(asistencia);
    } else {
      res.status(404).json({ message: 'Asistencia no encontrada.' });
    }
  } catch (e) {
    console.error(e);
    res.status(500).json({ message: 'Error al obtener asistencia.' });
  }
});

// POST crear asistencia
router.post('/', async (req, res) => {
  const {
    empleado_id,
    entrada,
    salida,
    historial,
    observacion,
    estado,
    fecha_anulado,
    creador_id,
    modificado_id,
    anulador_id,
  } = req.body;

  if (!empleado_id)
    return res.status(400).json({ message: 'El campo empleado_id es obligatorio.' });

  try {
    const nuevaAsistencia = await prisma.asistencia.create({
      data: {
        empleado_id: BigInt(empleado_id),
        entrada: entrada ? new Date(entrada) : null,
        salida: salida ? new Date(salida) : null,
        historial,
        observacion,
        estado,
        fecha_anulado: fecha_anulado ? new Date(fecha_anulado) : null,
        creador_id,
        modificado_id,
        anulador_id,
      },
    });
    res.status(201).json(nuevaAsistencia);
  } catch (e) {
    if (e instanceof Prisma.PrismaClientKnownRequestError) {
      if (e.code === 'P2003') {
        return res.status(400).json({ message: 'El empleado_id proporcionado no existe.' });
      }
    }

    console.error(e);
    res.status(500).json({ message: 'Error al crear asistencia.' });
  }
});

// PUT actualizar asistencia
router.put('/:id', async (req, res) => {
  const { id } = req.params;
  const {
    empleado_id,
    entrada,
    salida,
    historial,
    observacion,
    estado,
    fecha_anulado,
    modificado_id,
    anulador_id,
  } = req.body;

  try {
    const updateData = {
      entrada: entrada ? new Date(entrada) : undefined,
      salida: salida ? new Date(salida) : undefined,
      historial,
      observacion,
      estado,
      fecha_anulado: fecha_anulado ? new Date(fecha_anulado) : undefined,
      modificado_id,
      anulador_id,
    };

    if (empleado_id !== undefined) {
      updateData.empleado_id = BigInt(empleado_id);
    }

    const asistenciaActualizada = await prisma.asistencia.update({
      where: { id: parseInt(id) },
      data: updateData,
    });

    res.json(asistenciaActualizada);
  } catch (e) {
    if (e instanceof Prisma.PrismaClientKnownRequestError) {
      if (e.code === 'P2025') {
        return res.status(404).json({ message: 'Asistencia no encontrada para actualizar.' });
      }
      if (e.code === 'P2003') {
        return res.status(400).json({ message: 'El empleado_id proporcionado no existe.' });
      }
    }

    console.error(e);
    res.status(500).json({ message: 'Error al actualizar asistencia.' });
  }
});

// DELETE asistencia
router.delete('/:id', async (req, res) => {
  const { id } = req.params;
  try {
    await prisma.asistencia.delete({
      where: { id: parseInt(id) },
    });
    res.status(204).send();
  } catch (e) {
    if (e instanceof Prisma.PrismaClientKnownRequestError) {
      if (e.code === 'P2025') {
        return res.status(404).json({ message: 'Asistencia no encontrada para eliminar.' });
      }
    }

    console.error(e);
    res.status(500).json({ message: 'Error al eliminar asistencia.' });
  }
});

export default router;
