import { Router } from 'express';
import db from '../db/init.js';
import { sqlAll, sqlId, sqlOne } from '../db/helpers.js';
import { verificarToken } from '../middleware/auth.js';
import { calcularCostePorUnidad, redondearCoste } from '../services/coste.js';
const router = Router();
router.use(verificarToken);
router.get('/', (_req, res) => {
    const gastos = sqlAll(db.prepare('SELECT * FROM gastos ORDER BY nombre ASC').all());
    res.json(gastos);
});
router.get('/:id', (req, res) => {
    const gasto = sqlOne(db.prepare('SELECT * FROM gastos WHERE id = ?').get(sqlId(req.params.id)));
    if (!gasto) {
        res.status(404).json({ error: 'Gasto no encontrado' });
        return;
    }
    res.json(gasto);
});
router.post('/', (req, res) => {
    const { nombre, importe_compra, cantidad_lote, unidad_medida, descripcion } = req.body;
    if (!nombre || importe_compra == null || cantidad_lote == null || !unidad_medida) {
        res.status(400).json({ error: 'Faltan campos obligatorios' });
        return;
    }
    const coste = redondearCoste(calcularCostePorUnidad(importe_compra, cantidad_lote));
    const resultado = db.prepare(`
    INSERT INTO gastos (nombre, importe_compra, cantidad_lote, unidad_medida, coste_por_unidad, descripcion)
    VALUES (?, ?, ?, ?, ?, ?)
  `).run(nombre, importe_compra, cantidad_lote, unidad_medida, coste, descripcion ?? null);
    const gasto = sqlOne(db.prepare('SELECT * FROM gastos WHERE id = ?').get(Number(resultado.lastInsertRowid)));
    res.status(201).json(gasto);
});
router.put('/:id', (req, res) => {
    const id = sqlId(req.params.id);
    const existente = sqlOne(db.prepare('SELECT * FROM gastos WHERE id = ?').get(id));
    if (!existente) {
        res.status(404).json({ error: 'Gasto no encontrado' });
        return;
    }
    const { nombre, importe_compra, cantidad_lote, unidad_medida, descripcion } = req.body;
    const nuevoNombre = nombre ?? existente.nombre;
    const nuevoImporte = importe_compra ?? existente.importe_compra;
    const nuevaCantidad = cantidad_lote ?? existente.cantidad_lote;
    const nuevaUnidad = unidad_medida ?? existente.unidad_medida;
    const nuevaDescripcion = descripcion !== undefined ? descripcion : existente.descripcion;
    const coste = redondearCoste(calcularCostePorUnidad(nuevoImporte, nuevaCantidad));
    db.prepare(`
    UPDATE gastos
    SET nombre = ?, importe_compra = ?, cantidad_lote = ?, unidad_medida = ?,
        coste_por_unidad = ?, descripcion = ?, fecha_actualizacion = datetime('now')
    WHERE id = ?
  `).run(nuevoNombre, nuevoImporte, nuevaCantidad, nuevaUnidad, coste, nuevaDescripcion, id);
    const gasto = sqlOne(db.prepare('SELECT * FROM gastos WHERE id = ?').get(id));
    res.json(gasto);
});
router.delete('/:id', (req, res) => {
    const id = sqlId(req.params.id);
    const enUso = sqlOne(db.prepare('SELECT COUNT(*) as total FROM articulo_gastos WHERE gasto_id = ?').get(id));
    if (enUso && enUso.total > 0) {
        res.status(409).json({ error: 'El gasto está en uso en artículos y no puede eliminarse' });
        return;
    }
    const resultado = db.prepare('DELETE FROM gastos WHERE id = ?').run(id);
    if (Number(resultado.changes) === 0) {
        res.status(404).json({ error: 'Gasto no encontrado' });
        return;
    }
    res.status(204).send();
});
export default router;
