-- +goose Up
-- +goose StatementBegin
CREATE OR REPLACE PROCEDURE VITRUVIO.PRC_FLASH_ATUALIZA_CONTRIBUICAO_DONO (
    p_data_inicial IN DATE,
    p_data_final   IN DATE,
    p_empresas     IN VARCHAR2 DEFAULT NULL,
    p_divisao      IN VARCHAR2 DEFAULT NULL,
    p_cgos         IN VARCHAR2 DEFAULT NULL
) AS
    v_inicio_execucao DATE := SYSDATE;
BEGIN
    DBMS_OUTPUT.PUT_LINE('Iniciando PRC_FLASH_ATUALIZA_CONTRIBUICAO_DONO em ' || TO_CHAR(v_inicio_execucao, 'DD/MM/YYYY HH24:MI:SS'));
    DBMS_OUTPUT.PUT_LINE('Período: ' || TO_CHAR(p_data_inicial, 'DD/MM/YYYY') || ' até ' || TO_CHAR(p_data_final, 'DD/MM/YYYY'));

    FOR r IN (
        SELECT CODIGO_EXTERNO AS CODIGO
          FROM vitruvio.vi_lojas V
         WHERE p_empresas IS NULL
            OR CODIGO_EXTERNO IN (
                SELECT REGEXP_SUBSTR(p_empresas, '[^,]+', 1, LEVEL)
                  FROM dual
                CONNECT BY REGEXP_SUBSTR(p_empresas, '[^,]+', 1, LEVEL) IS NOT NULL
               )
         ORDER BY CODIGO_EXTERNO
    ) LOOP
        BEGIN
            DBMS_OUTPUT.PUT_LINE('Carregando contribuição da empresa: ' || r.codigo);
            PRC_FLASH_CARGA_DADOS_CONTRIBUICAO(
                p_data_inicial => p_data_inicial,
                p_data_final   => p_data_final,
                p_empresa      => r.codigo,
                p_divisao      => p_divisao,
                p_cgos         => p_cgos
            );
        EXCEPTION
            WHEN OTHERS THEN
                DBMS_OUTPUT.PUT_LINE('Erro ao carregar empresa ' || r.codigo || ': ' || SQLERRM);
                RAISE;
        END;
    END LOOP;

    DBMS_OUTPUT.PUT_LINE('Carregando stage de metas de contribuição...');
    PRC_FLASH_CARGA_META_CONTRIBUICAO_STG(p_data_inicial => p_data_inicial, p_data_final => p_data_final);

    DBMS_OUTPUT.PUT_LINE('Carregando metas finais de contribuição...');
    PRC_FLASH_CARGA_META_CONTRIBUICAO(p_data_inicial => p_data_inicial, p_data_final => p_data_final);

    DBMS_OUTPUT.PUT_LINE('Atualizando resumo de contribuição...');
    PRC_FLASH_CARGA_RESUMO_CONTRIBUICAO(p_data_inicial => p_data_inicial, p_data_final => p_data_final);

    DBMS_OUTPUT.PUT_LINE('PRC_FLASH_ATUALIZA_CONTRIBUICAO_DONO finalizada em ' || TO_CHAR(SYSDATE, 'DD/MM/YYYY HH24:MI:SS'));
    DBMS_OUTPUT.PUT_LINE('Tempo em segundos: ' || ROUND((SYSDATE - v_inicio_execucao) * 86400, 2));

EXCEPTION
    WHEN OTHERS THEN
        DBMS_OUTPUT.PUT_LINE('Erro geral na PRC_FLASH_ATUALIZA_CONTRIBUICAO_DONO: ' || SQLERRM);
        RAISE;
END;
-- +goose StatementEnd

-- +goose Down
-- +goose StatementBegin
DECLARE
    v_count NUMBER;
BEGIN
    SELECT COUNT(*) INTO v_count FROM user_objects WHERE object_name = 'PRC_FLASH_ATUALIZA_CONTRIBUICAO_DONO' AND object_type = 'PROCEDURE';
    IF v_count > 0 THEN
        EXECUTE IMMEDIATE 'DROP PROCEDURE PRC_FLASH_ATUALIZA_CONTRIBUICAO_DONO';
    END IF;
END;
-- +goose StatementEnd
