-- +goose Up
-- +goose StatementBegin
CREATE OR REPLACE PROCEDURE VITRUVIO.PRC_FLASH_CARGA_META_CONTRIBUICAO (
    p_data_inicial IN DATE,
    p_data_final   IN DATE
) AS
    v_id_nodo      NUMBER;
    v_id_nodo_pai  NUMBER;
BEGIN
    DELETE FROM TB_FLASH_META_CONTRIBUICAO
     WHERE data_referencia BETWEEN p_data_inicial AND p_data_final;

    FOR r IN (
        SELECT *
          FROM TB_FLASH_META_CONTRIBUICAO_STG
         WHERE data_referencia BETWEEN p_data_inicial AND p_data_final
    ) LOOP
        v_id_nodo := NULL;
        v_id_nodo_pai := NULL;

        IF r.codigo_nodo_pai IS NOT NULL THEN
            BEGIN
                SELECT n.id_nodo
                  INTO v_id_nodo_pai
                  FROM TB_FLASH_NODO n
                 WHERE n.codigo = r.codigo_nodo_pai
                   AND n.tipo_nodo = r.tipo_nodo_pai
                   AND NVL(n.cod_empresa, -1) = NVL(r.cod_empresa, -1);
            EXCEPTION
                WHEN TOO_MANY_ROWS THEN v_id_nodo_pai := NULL;
                WHEN NO_DATA_FOUND THEN v_id_nodo_pai := NULL;
            END;
        END IF;

        BEGIN
            IF r.tipo_nodo = 'EMPRESA' THEN
                SELECT n.id_nodo INTO v_id_nodo
                  FROM TB_FLASH_NODO n
                 WHERE n.tipo_nodo = 'EMPRESA'
                   AND n.codigo = r.codigo_nodo
                   AND n.id_nodo_pai IS NULL;
            ELSIF r.tipo_nodo = 'PRODUTO' THEN
                SELECT n.id_nodo INTO v_id_nodo
                  FROM TB_FLASH_NODO n
                 WHERE n.tipo_nodo = 'PRODUTO'
                   AND n.codigo = r.codigo_nodo
                   AND NVL(n.cod_empresa, -1) = NVL(r.cod_empresa, -1)
                   AND (v_id_nodo_pai IS NULL OR n.id_nodo_pai = v_id_nodo_pai);
            ELSE
                SELECT n.id_nodo INTO v_id_nodo
                  FROM TB_FLASH_NODO n
                 WHERE n.tipo_nodo = 'CATEGORIA'
                   AND n.codigo = r.codigo_nodo
                   AND NVL(n.cod_empresa, -1) = NVL(r.cod_empresa, -1)
                   AND (v_id_nodo_pai IS NULL OR n.id_nodo_pai = v_id_nodo_pai);
            END IF;
        EXCEPTION
            WHEN TOO_MANY_ROWS THEN v_id_nodo := NULL;
            WHEN NO_DATA_FOUND THEN v_id_nodo := NULL;
        END;

        IF v_id_nodo IS NOT NULL THEN
            MERGE INTO TB_FLASH_META_CONTRIBUICAO dst
            USING (
                SELECT v_id_nodo AS id_nodo,
                       r.data_referencia AS data_referencia,
                       r.ano_referencia AS ano_referencia,
                       r.mes_referencia AS mes_referencia,
                       r.dia_referencia AS dia_referencia,
                       r.percentual_meta AS percentual_meta,
                       r.valor_meta AS valor_meta,
                       r.observacao AS observacao
                  FROM dual
            ) src
            ON (dst.id_nodo = src.id_nodo AND dst.data_referencia = src.data_referencia)
            WHEN MATCHED THEN UPDATE SET
                dst.percentual_meta = src.percentual_meta,
                dst.valor_meta = src.valor_meta,
                dst.observacao = src.observacao,
                dst.ano_referencia = src.ano_referencia,
                dst.mes_referencia = src.mes_referencia,
                dst.dia_referencia = src.dia_referencia,
                dst.data_atualizacao = SYSDATE
            WHEN NOT MATCHED THEN INSERT (
                id_meta, id_nodo, data_referencia, ano_referencia, mes_referencia, dia_referencia,
                percentual_meta, valor_meta, observacao, data_cadastro, data_atualizacao
            ) VALUES (
                SEQ_TB_FLASH_META_CONTRIBUICAO.NEXTVAL, src.id_nodo, src.data_referencia, src.ano_referencia,
                src.mes_referencia, src.dia_referencia, src.percentual_meta, src.valor_meta, src.observacao,
                SYSDATE, NULL
            );
        END IF;
    END LOOP;

    COMMIT;
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_CARGA_META_CONTRIBUICAO' AND object_type = 'PROCEDURE';
    IF v_count > 0 THEN
        EXECUTE IMMEDIATE 'DROP PROCEDURE PRC_FLASH_CARGA_META_CONTRIBUICAO';
    END IF;
END;
-- +goose StatementEnd
