DROP PROCEDURE IF EXISTS UpdateNumerosBodegas;

DELIMITER $$
CREATE PROCEDURE UpdateNumerosBodegas()
BEGIN
    DECLARE done INT DEFAULT FALSE;
    DECLARE bodegaId VARCHAR(32);

    -- Declarar variables antes del cursor
    DECLARE maximo_numero_movimiento INT;
    DECLARE minimo_numero_movimiento INT;
    DECLARE total_movimiento INT;

    DECLARE maximo_numero_devolucion INT;
    DECLARE minimo_numero_devolucion INT;
    DECLARE total_devolucion INT;

    DECLARE maximo_numero_ajuste INT;
    DECLARE minimo_numero_ajuste INT;
    DECLARE total_ajuste INT;

    DECLARE maximo_numero_traslado INT;
    DECLARE minimo_numero_traslado INT;
    DECLARE total_traslado INT;

    DECLARE maximo_numero_borrado INT;
    DECLARE minimo_numero_borrado INT;
    DECLARE total_borrado INT;

    DECLARE maximo_numero_cancelacion INT;
    DECLARE minimo_numero_cancelacion INT;
    DECLARE total_cancelacion INT;

    -- Obtener números de entrada y salida
    DECLARE max_num_entrada INT;
    DECLARE min_num_entrada INT;
    DECLARE total_entrada INT;

    DECLARE max_num_salida INT;
    DECLARE min_num_salida INT;
    DECLARE total_salida INT;

    DECLARE bodegaCursor CURSOR FOR SELECT bodega_id FROM bodega WHERE activo = 'Si';
    DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;

    -- Cursor para recorrer bodegas activas
    OPEN bodegaCursor;

    read_loop: LOOP
        FETCH bodegaCursor INTO bodegaId;
        IF done THEN
            LEAVE read_loop;
        END IF;

        SELECT MAX(numero_real), MIN(numero_real), COUNT(*)
        INTO max_num_entrada, min_num_entrada, total_entrada
        FROM nota_bodega
        WHERE bodega_id = bodegaId AND entrada_salida = 'Entrada' AND tipo NOT IN ('Cancelacion', 'Correccion', 'Borrado');

        SELECT MAX(numero_real), MIN(numero_real), COUNT(*)
        INTO max_num_salida, min_num_salida, total_salida
        FROM nota_bodega
        WHERE bodega_id = bodegaId AND entrada_salida = 'Salida' AND tipo NOT IN ('Cancelacion', 'Correccion', 'Borrado');

        -- Obtener valores de Movimiento
        SELECT MAX(numero_real), MIN(numero_real), COUNT(*)
        INTO maximo_numero_movimiento, minimo_numero_movimiento, total_movimiento
        FROM nota_bodega
        WHERE bodega_id = bodegaId AND tipo = 'Movimiento';

        -- Obtener valores de Devolucion
        SELECT MAX(numero_real), MIN(numero_real), COUNT(*)
        INTO maximo_numero_devolucion, minimo_numero_devolucion, total_devolucion
        FROM nota_bodega
        WHERE bodega_id = bodegaId AND tipo = 'Devolucion';

        -- Obtener valores de Correccion
        SELECT MAX(numero_real), MIN(numero_real), COUNT(*)
        INTO maximo_numero_ajuste, minimo_numero_ajuste, total_ajuste
        FROM nota_bodega
        WHERE bodega_id = bodegaId AND tipo = 'Correccion';

        -- Obtener valores de Traslado
        SELECT MAX(numero_real), MIN(numero_real), COUNT(*)
        INTO maximo_numero_traslado, minimo_numero_traslado, total_traslado
        FROM nota_bodega
        WHERE bodega_id = bodegaId AND tipo = 'Traslado';

        -- Obtener valores de Borrado
        SELECT MAX(numero_real), MIN(numero_real), COUNT(*)
        INTO maximo_numero_borrado, minimo_numero_borrado, total_borrado
        FROM nota_bodega
        WHERE bodega_id = bodegaId AND tipo = 'Borrado';

        -- Obtener valores de Cancelacion
        SELECT MAX(numero_real), MIN(numero_real), COUNT(*)
        INTO maximo_numero_cancelacion, minimo_numero_cancelacion, total_cancelacion
        FROM nota_bodega
        WHERE bodega_id = bodegaId AND tipo = 'Cancelacion';



        -- Sumar total de tipos deseados
        SET @total_sum = total_entrada + total_salida +  total_ajuste + total_borrado + total_cancelacion;

        -- Actualizar la tabla numeros_bodegas
        INSERT INTO numeros_bodegas (bodega_id, maximo_numero_movimiento, minimo_numero_movimiento, nv_movimiento,
                                     maximo_numero_devolucion, minimo_numero_devolucion, nv_devolucion,
                                     maximo_numero_ajuste, minimo_numero_ajuste, nv_ajuste,
                                     maximo_numero_traslado, minimo_numero_traslado, nv_traslado,
                                     maximo_numero_cancelacion_borrado, minimo_numero_cancelacion_borrado, nv_cancelacion_borrado,
                                     nv_all, maximo_numero_entrada, minimo_numero_entrada, nv_entrada, maximo_numero_salida, minimo_numero_salida, nv_salida)
        VALUES (bodegaId, maximo_numero_movimiento, minimo_numero_movimiento, total_movimiento,
                maximo_numero_devolucion, minimo_numero_devolucion,total_devolucion,
                maximo_numero_ajuste, minimo_numero_ajuste, total_ajuste,
                maximo_numero_traslado, minimo_numero_traslado, total_traslado,
                GREATEST(maximo_numero_borrado,maximo_numero_cancelacion),
                LEAST(minimo_numero_borrado,  minimo_numero_cancelacion),
                total_borrado + total_cancelacion,
                @total_sum,
                max_num_entrada,
                min_num_entrada,
                total_entrada,
                max_num_salida,
                min_num_salida,
                total_salida)
        ON DUPLICATE KEY UPDATE
                             maximo_numero_movimiento = VALUES(maximo_numero_movimiento),
                             minimo_numero_movimiento = VALUES(minimo_numero_movimiento),
                             nv_movimiento = VALUES(nv_movimiento),
                             maximo_numero_devolucion = VALUES(maximo_numero_devolucion),
                             minimo_numero_devolucion = VALUES(minimo_numero_devolucion),
                             nv_devolucion = VALUES(nv_devolucion),
                             maximo_numero_ajuste = VALUES(maximo_numero_ajuste),
                             minimo_numero_ajuste = VALUES(minimo_numero_ajuste),
                             nv_ajuste = VALUES(nv_ajuste),
                             maximo_numero_traslado = VALUES(maximo_numero_traslado),
                             minimo_numero_traslado = VALUES(minimo_numero_traslado),
                             nv_traslado = VALUES(nv_traslado),
                             maximo_numero_cancelacion_borrado = VALUES(maximo_numero_cancelacion_borrado),
                             minimo_numero_cancelacion_borrado = VALUES(minimo_numero_cancelacion_borrado),

                             nv_cancelacion_borrado = VALUES(nv_cancelacion_borrado),
                             nv_all = VALUES(nv_all),
                             maximo_numero_entrada = VALUES(maximo_numero_entrada),
                         minimo_numero_entrada = VALUES(minimo_numero_entrada),
                         nv_entrada = VALUES(nv_entrada),
                         maximo_numero_salida = VALUES(maximo_numero_salida),
                         minimo_numero_salida = VALUES(minimo_numero_salida),
                         nv_salida = VALUES(nv_salida);
    END LOOP;

    CLOSE bodegaCursor;
END$$

DELIMITER ;

