import express from 'express'
import { PrismaClient, Prisma } from '../../prisma/generated/client/index.js'

const router = express.Router()
const prisma = new PrismaClient()

const fixBigInt = (data) =>
  JSON.parse(JSON.stringify(data, (_, v) => (typeof v === 'bigint' ? v.toString() : v)))

// ───── GET todos los empleados ─────
router.get('/', async (_req, res) => {
  try {
    const empleados = await prisma.cliente.findMany({ where: { empleado: true } })
    res.json(fixBigInt(empleados))
  } catch (e) {
    console.error(e)
    res.status(500).json({ message: 'Error al obtener empleados.' })
  }
})

// ───── GET empleado por ID ─────
router.get('/:id', async (req, res) => {
  const id = BigInt(req.params.id)
  try {
    const empleado = await prisma.cliente.findFirst({ where: { id, empleado: true } })
    if (!empleado) return res.status(404).json({ message: 'Empleado no encontrado.' })
    res.json(fixBigInt(empleado))
  } catch (e) {
    console.error(e)
    res.status(500).json({ message: 'Error al obtener empleado.' })
  }
})

// ───── POST crear empleado ─────
router.post('/', async (req, res) => {
  const {
    name,
    cedula,
    telefono,
    ubicacion = '.',
    grupo_estudio,
    avatar_url,
    idciat,
  } = req.body

  try {
    const nuevo = await prisma.cliente.create({
      data: {
        name,
        cedula: BigInt(cedula),
        telefono,
        ubicacion,
        grupo_estudio,
        avatar_url,
        idciat,
        empleado: true,
      },
    })
    res.status(201).json(fixBigInt(nuevo))
  } catch (e) {
    if (e instanceof Prisma.PrismaClientKnownRequestError) {
      if (e.code === 'P2002') {
        return res.status(400).json({ message: 'Ya existe un cliente con esa cédula.' })
      }
    }

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

// ───── PUT actualizar empleado ─────
router.put('/:id', async (req, res) => {
  const id = BigInt(req.params.id)
  const {
    name,
    cedula,
    telefono,
    ubicacion,
    grupo_estudio,
    avatar_url,
    idciat,
  } = req.body

  try {
    const existe = await prisma.cliente.findFirst({ where: { id, empleado: true } })
    if (!existe) return res.status(404).json({ message: 'Empleado no encontrado.' })

    const actualizado = await prisma.cliente.update({
      where: { id },
      data: {
        name,
        cedula: cedula !== undefined ? BigInt(cedula) : undefined,
        telefono,
        ubicacion,
        grupo_estudio,
        avatar_url,
        idciat,
      },
    })
    res.json(fixBigInt(actualizado))
  } catch (e) {
    if (e instanceof Prisma.PrismaClientKnownRequestError) {
      if (e.code === 'P2002') {
        return res.status(400).json({ message: 'Ya existe un cliente con esa cédula.' })
      }
      if (e.code === 'P2025') {
        return res.status(404).json({ message: 'Empleado no encontrado para actualizar.' })
      }
    }

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

// ───── DELETE eliminar empleado ─────
router.delete('/:id', async (req, res) => {
  const id = BigInt(req.params.id)
  try {
    const existe = await prisma.cliente.findFirst({ where: { id, empleado: true } })
    if (!existe) return res.status(404).json({ message: 'Empleado no encontrado.' })

    await prisma.cliente.delete({ where: { id } })
    res.status(204).send()
  } catch (e) {
    if (e instanceof Prisma.PrismaClientKnownRequestError) {
      if (e.code === 'P2025') {
        return res.status(404).json({ message: 'Empleado no encontrado para eliminar.' })
      }
    }

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

export default router
