create or replace procedure prc_26ai_health_hemograma( p_id in number, 
                                                       p_comp_id in varchar2, 
                                                       p_credential in varchar2 default 'OCI_CRED')
as    
/*

  Criado por: fernando.leal@oracle.com
  Data: Dez/2025
  Objetivo: demonstrar casos de uso do Oracle AI Database 26ai

  v1 - extrair chunks do hemograma para viabilizar a execucao da funcao de RAG. Tabela TMP: TB_26AI_HEALTH_HEMOGRAMA_TMP

*/                                                  
  v_hemograma clob := empty_clob();
  v_chunk        VARCHAR2(32767);
  v_offset       INTEGER := 1;
  v_chunk_size   CONSTANT INTEGER := 10000; -- 10 KB
  v_length       INTEGER;
  v_has number;
begin

   select count(1) 
   into v_has
   from  TB_26AI_HEALTH_HEMOGRAMA_TMP 
   where id = p_id;
   
   if v_has = 0 then

        select  replace(replace(replace(replace( dbms_vector_chain.utl_to_text(  dt.file_content ) ,chr(10),' '),chr(13),' '),'"',''),'''','') 
       into v_hemograma
         from TB_26AI_HEALTH_HEMOGRAMA dt
       where id =  p_id; 

      -- Tamanho total do texto
      v_length := dbms_lob.getlength(v_hemograma);

      -- Loop em blocos de 10KB
      WHILE v_offset <= v_length LOOP

        v_chunk := dbms_lob.substr(
                      v_hemograma,
                      v_chunk_size,
                      v_offset
                   );

      insert into TB_26AI_HEALTH_HEMOGRAMA_TMP 
            WITH dados AS (
              SELECT FNC_26ai_RAG(
                '##Você é um sistema de extração de dados laboratoriais.
            ##Tarefa:
            A partir do texto bruto de um laudo de exames laboratoriais, extraia SOMENTE os exames realizados e seus respectivos valores numéricos com unidades.
            ##Regras obrigatórias:
            1. Retorne exclusivamente um objeto JSON, e nunca use Markdown como ```json .
            2. Cada chave deve ser o nome do exame (em português, da mesma maneira que esta no hemograma original).
            3. Cada valor deve conter apenas o valor do exame + unidade, exatamente como apresentado no laudo.
            4. Ignore completamente:
               - Intervalos de referência
               - Percentuais quando houver valor absoluto equivalente (priorize o valor absoluto)
               - Dados do paciente, médicos, datas, assinaturas, métodos, gráficos, observações, textos legais e administrativos
               - Repetições do mesmo exame (considere apenas o resultado mais recente)
            5. Não faça interpretações clínicas.
            6. Não normalize valores nem converta unidades.
            7. Não inclua textos explicativos.
            8. Não agrupe exames — cada exame deve ser uma entrada independente.
            9. Caso um exame possua mais de uma medida válida (ex: percentual e absoluto), utilize o valor absoluto com unidade.
            ##Formato de saída (exemplo):
            {
          "exames": [
            ["eritrocitos", "4,65 10^6/µL"],
            ["hemoglobina", "14,8 g/dL"],
            ["hematocrito", "43,8 %"],
            ["vcm", "94,3 fL"]
            ...
          ]
        }
        ##Texto de entrada:'  || v_chunk,  p_credential, p_comp_id ) json_text
            )
          SELECT
              p_id,
              v('APP_SESSION'), 
              current_timestamp, 
              v_chunk,
              jt.exame_nome,
              jt.exame_valor
        FROM dados d,
             JSON_TABLE(
               d.json_text,
               '$.exames[*]'
               COLUMNS (
                 exame_nome  VARCHAR2(100) PATH '$[0]',
                 exame_valor VARCHAR2(100) PATH '$[1]'
               )
             ) jt;

        v_offset := v_offset + v_chunk_size;

      END LOOP;

    end if; -- if v_has = 0 then

commit;

end;
/