'use strict'

const { Op } = require('sequelize');
const Area = require('../models/area');

function toUpper(str) {
    return str ? str.toString().trim().toUpperCase() : '';
}

async function listarAreas(req, res) {
    try {
        const areas = await Area.findAll({ order: [['ID_AREA', 'ASC']] });
        res.status(200).json({ message: 'Areas obtenidas', data: areas });
    } catch (err) {
        res.status(500).json({ message: 'Error al obtener areas', error: err.message });
    }
}

async function registrarArea(req, res) {
    try {
        const descripcion = toUpper(req.body.DESCRIPCION);
        if (!descripcion) return res.status(400).json({ message: 'La descripcion es obligatoria' });

        const existe = await Area.findOne({ where: { DESCRIPCION: descripcion } });
        if (existe) return res.status(409).json({ message: 'Ya existe un area con esa descripcion' });

        const nueva = await Area.create({ CODIGO: 0, DESCRIPCION: descripcion, ESTADO: 1 });
        res.status(201).json({ message: 'Area registrada exitosamente', data: nueva });
    } catch (err) {
        res.status(500).json({ message: 'Error al registrar area', error: err.message });
    }
}

async function actualizarArea(req, res) {
    try {
        const area = await Area.findByPk(req.params.id);
        if (!area) return res.status(404).json({ message: 'Area no encontrada' });

        const descripcion = toUpper(req.body.DESCRIPCION);
        if (!descripcion) return res.status(400).json({ message: 'La descripcion es obligatoria' });

        const duplicado = await Area.findOne({
            where: { DESCRIPCION: descripcion, ID_AREA: { [Op.ne]: req.params.id } }
        });
        if (duplicado) return res.status(409).json({ message: 'Ya existe otra area con esa descripcion' });

        await Area.update({ DESCRIPCION: descripcion }, { where: { ID_AREA: req.params.id } });
        res.status(200).json({ message: 'Area actualizada exitosamente' });
    } catch (err) {
        res.status(500).json({ message: 'Error al actualizar area', error: err.message });
    }
}

async function cambiarEstadoArea(req, res) {
    try {
        const area = await Area.findByPk(req.params.id);
        if (!area) return res.status(404).json({ message: 'Area no encontrada' });

        const nuevoEstado = area.ESTADO === 1 ? 0 : 1;
        await Area.update({ ESTADO: nuevoEstado }, { where: { ID_AREA: req.params.id } });

        res.status(200).json({
            message: `Area ${nuevoEstado === 1 ? 'activada' : 'desactivada'} exitosamente`,
            estado: nuevoEstado
        });
    } catch (err) {
        res.status(500).json({ message: 'Error al cambiar estado del area', error: err.message });
    }
}

module.exports = { listarAreas, registrarArea, actualizarArea, cambiarEstadoArea };
