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

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

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

// POST create new planilla
router.post('/', async (req, res) => {
  const {
    empleado_id,
    fecha_desde,
    fecha_hasta,
    titulo,
    total,
    estado,
    fecha_anulado,
    creador_id,
    anulador_id,
  } = req.body;

  if (!empleado_id || !fecha_desde || !fecha_hasta || !titulo) {
    return res.status(400).json({
      message: 'Los campos empleado_id, fecha_desde, fecha_hasta y titulo son obligatorios.',
    });
  }

  try {
    const nuevaPlanilla = await prisma.planilla.create({
      data: {
        empleado_id: parseInt(empleado_id),
        fecha_desde: new Date(fecha_desde),
        fecha_hasta: new Date(fecha_hasta),
        titulo,
        total: total ? parseFloat(total) : null,
        estado: estado || 'pagado',
        fecha_anulado: fecha_anulado ? new Date(fecha_anulado) : null,
        creador_id,
        anulador_id,
      },
    });
    res.status(201).json(nuevaPlanilla);
  } 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 planilla.' });
  }
});

// PUT update planilla by ID
router.put('/:id', async (req, res) => {
  const { id } = req.params;
  const {
    empleado_id,
    fecha_desde,
    fecha_hasta,
    titulo,
    total,
    estado,
    fecha_anulado,
    anulador_id,
  } = req.body;

  try {
    const updateData = {};
    if (empleado_id !== undefined) updateData.empleado_id = parseInt(empleado_id);
    if (fecha_desde !== undefined) updateData.fecha_desde = new Date(fecha_desde);
    if (fecha_hasta !== undefined) updateData.fecha_hasta = new Date(fecha_hasta);
    if (titulo !== undefined) updateData.titulo = titulo;
    if (total !== undefined) updateData.total = total ? parseFloat(total) : null;
    if (estado !== undefined) updateData.estado = estado;
    if (fecha_anulado !== undefined) updateData.fecha_anulado = fecha_anulado ? new Date(fecha_anulado) : null;
    if (anulador_id !== undefined) updateData.anulador_id = anulador_id;

    const planillaActualizada = await prisma.planilla.update({
      where: { id: parseInt(id) },
      data: updateData,
    });
    res.json(planillaActualizada);
  } catch (e) {
    if (e instanceof Prisma.PrismaClientKnownRequestError) {
      if (e.code === 'P2025') {
        return res.status(404).json({ message: 'Planilla 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 planilla.' });
  }
});

// DELETE planilla by ID
router.delete('/:id', async (req, res) => {
  const { id } = req.params;
  try {
    await prisma.planilla.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: 'Planilla no encontrada para eliminar.' });
      }
    }
    console.error(e);
    res.status(500).json({ message: 'Error al eliminar planilla.' });
  }
});

export default router;
