'use strict';

const toUpper = (val) => (typeof val === 'string' && val) ? val.toUpperCase().trim() : val;

const Local = require('../models/local');
const { Op } = require('sequelize');

// Listar todos los locales
async function listarLocales(req, res) {
    try {
        const locales = await Local.findAll({
            order: [['ID_LOCAL', 'ASC']]
        });

        res.status(200).send({
            data: locales
        });

    } catch (e) {
        console.log('Error listarLocales:', e);
        res.status(500).send({
            message: e.name || 'Error al obtener los locales'
        });
    }
}

// Obtener un local por ID
async function obtenerLocal(req, res) {
    try {
        const { id } = req.params;

        const local = await Local.findOne({
            where: { ID_LOCAL: id }
        });

        if (!local) {
            return res.status(404).send({
                message: 'Local no encontrado'
            });
        }

        res.status(200).send({
            data: local
        });

    } catch (e) {
        console.log('Error obtenerLocal:', e);
        res.status(500).send({
            message: e.name || 'Error al obtener el local'
        });
    }
}

// Registrar nuevo local
async function registrarLocal(req, res) {
    try {
        const { NOMBRE, ACTIVO } = req.body;

        if (!NOMBRE || NOMBRE.trim() === '') {
            return res.status(400).send({
                message: 'El nombre del local es obligatorio'
            });
        }

        // Verificar si ya existe un local con ese nombre
        const localExistente = await Local.findOne({
            where: {
                NOMBRE: {
                    [Op.like]: NOMBRE.trim()
                }
            }
        });

        if (localExistente) {
            return res.status(400).send({
                message: 'Ya existe un local con ese nombre'
            });
        }

        const nuevoLocal = await Local.create({
            NOMBRE: toUpper(NOMBRE),
            ACTIVO: ACTIVO !== undefined ? ACTIVO : true
        });

        res.status(201).send({
            message: 'Local registrado exitosamente',
            data: nuevoLocal
        });

    } catch (e) {
        console.log('Error registrarLocal:', e);
        res.status(500).send({
            message: e.name || 'Error al registrar el local'
        });
    }
}

// Actualizar local
async function actualizarLocal(req, res) {
    try {
        const { id } = req.params;
        const { NOMBRE, ACTIVO } = req.body;

        if (!NOMBRE || NOMBRE.trim() === '') {
            return res.status(400).send({
                message: 'El nombre del local es obligatorio'
            });
        }

        const local = await Local.findOne({
            where: { ID_LOCAL: id }
        });

        if (!local) {
            return res.status(404).send({
                message: 'Local no encontrado'
            });
        }

        // Verificar si ya existe otro local con ese nombre
        const localExistente = await Local.findOne({
            where: {
                NOMBRE: {
                    [Op.like]: NOMBRE.trim()
                },
                ID_LOCAL: {
                    [Op.ne]: id
                }
            }
        });

        if (localExistente) {
            return res.status(400).send({
                message: 'Ya existe otro local con ese nombre'
            });
        }

        await local.update({
            NOMBRE: toUpper(NOMBRE),
            ACTIVO: ACTIVO !== undefined ? ACTIVO : local.ACTIVO,
            FECHA_ACTUALIZACION: new Date()
        });

        res.status(200).send({
            message: 'Local actualizado exitosamente',
            data: local
        });

    } catch (e) {
        console.log('Error actualizarLocal:', e);
        res.status(500).send({
            message: e.name || 'Error al actualizar el local'
        });
    }
}

// Eliminar local
async function eliminarLocal(req, res) {
    try {
        const { id } = req.params;

        const local = await Local.findOne({
            where: { ID_LOCAL: id }
        });

        if (!local) {
            return res.status(404).send({
                message: 'Local no encontrado'
            });
        }

        await local.destroy();

        res.status(200).send({
            message: 'Local eliminado exitosamente'
        });

    } catch (e) {
        console.log('Error eliminarLocal:', e);
        res.status(500).send({
            message: e.name || 'Error al eliminar el local'
        });
    }
}

module.exports = {
    listarLocales,
    obtenerLocal,
    registrarLocal,
    actualizarLocal,
    eliminarLocal
};
