create or replace function fnc_26ai_utilities( p_image_id in number, 
                                            p_comp_id in varchar2,
                                            p_credential in varchar2 default 'OCI_CRED')
return clob
as
/*

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

  v1 - funcao principal de Utilities, com similaridade e RAG - leal


-- carga imagens

    DECLARE
      v_bucket VARCHAR2(2000) := 
          'https://objectstorage.sa-saopaulo-1.oraclecloud.com/n/idi1o0a010nx/b/bucket-img-tmp-torrescarga/o/';
    BEGIN

     -- lista todos arquivos do bucket que ainda nao foram vetorizados
     FOR r1 IN (
        SELECT object_name,  
               substr(object_name,1,instr(object_name,'/')-1) torre_name,
               substr(object_name,instr(object_name,'/')+1) file_name
        FROM DBMS_CLOUD.LIST_OBJECTS('OCI_CRED', 'https://objectstorage.sa-saopaulo-1.oraclecloud.com/n/idi1o0a010nx/b/bucket-img-tmp-torrescarga/o')
        WHERE lower(object_name) LIKE '%.jpg'
          AND object_name NOT IN (
                SELECT object_name
                FROM TB_26AI_UTILITIES_LOG
                WHERE status = 'P'
          )  
     ) LOOP

        -- copia temporaria do PDF para o DIRECTORY
        -- exemplo >  https://objectstorage.sa-saopaulo-1.oraclecloud.com/n/idi1o0a010nx/b/bucket-img-tmp-torrescarga/o/T.472%2FDJI_0167.JPG
        DBMS_CLOUD.GET_OBJECT(
            credential_name => 'OCI_CRED',
            object_uri      => v_bucket || replace( r1.object_name, '%2F', '/') ,
            directory_name  => 'DATA_PUMP_DIR'
        );

       -- teste:  select *  FROM DBMS_CLOUD.LIST_FILES ('DATA_PUMP_DIR') where object_name like 'DJI%'
       
       
       insert into TB_26AI_UTILITIES
         ( FILE_NAME,
           FILE_MIMETYPE,
           FILE_BLOB,
           UPDATED_DATE,
           CREATED_BY,
           REFERENCE_NAME)
       values( 
            r1.file_name,
            'image/jpeg',
            to_blob(bfilename('DATA_PUMP_DIR', r1.file_name )),
            sysdate,
            'admin2',
            r1.torre_name
         );   
           
        INSERT INTO TB_26AI_UTILITIES_LOG
        VALUES (sysdate, r1.object_name, 'P');

        COMMIT;

        -- remove o arquivo temporario armazenado no DATA_PUMP_DIR
        DBMS_CLOUD.DELETE_FILE(
            directory_name => 'DATA_PUMP_DIR',
            file_name      =>  r1.file_name
        );

     END LOOP;

    END;
     



--Ajuste de Status

        declare
          v_status varchar2(200);
          v_has number;
        begin

         for r1 in (select * from TB_26AI_UTILITIES where status_torre is null ) loop
         
            v_status :=  FNC_26ai_rag ( 'A partir deste texto retorne uma "Classificação da Gravidade": 
                # Risco controlável - PRIORIDADE 3, PRIORITÁRIA 60D
                # Risco alto - PRIORIDADE 2, URGÊNCIA 30D
                # Risco elevado - PRIORIDADE 1, URGÊNCIA 15D
                # Risco iminente - PRIORIDADE 0, EMERGÊNCIA (1 dia)
                Retorne apenas a classificaco como: "Risco controlável","Risco alto","Risco elevado","Risco iminente". Nenhum comentario é permitido. 
                Dados: ' ||  fnc_26ai_utilities( p_image_id =>  r1.id , 
                                            p_comp_id => 'ocid1.compartment.oc1..aaaaaaaakvd4bq4b3n7yn3gjjqzfhsl62dec44tjvi2iwa3sugw5frgfpzea' ) , 
             'OCI_CRED',  
            ''  
             ) ;

            update TB_26AI_UTILITIES set status_torre = v_status where id = r1.id;
            commit;
            
         end loop;   
            
        end;

-- Geo

begin
    UPDATE TB_26AI_UTILITIES t
    SET GEOMETRY = SDO_GEOMETRY(
            2001,                 -- 2D point
            4326,                 -- SRID
            SDO_POINT_TYPE(t.LONGITUDE, t.LATITUDE, NULL),
            NULL,
            NULL
    )
    where  GEOMETRY is null ;
    commit;   
end;    
   
*/
   messages CLOB;
   params_genai CLOB;
   v_vector clob; 
   p_prompt clob;
   p_prompt2 clob;
   reranked_output json;
   output CLOB; 
begin

  SELECT json_value( fnc_26ai_embed_image_cohere(file_name, file_blob, p_credential , p_comp_id) , '$.embeddings[*].vector()')        
    INTO v_vector
    from TB_26AI_UTILITIES
    where id = p_image_id;   

  for message_cursor in (

           SELECT embed_data , source
						FROM TB_26AI_UTILITIES_VECTOR
						ORDER BY VECTOR_DISTANCE(EMBED_VECTOR, v_vector , COSINE    )
						FETCH EXACT FIRST 20 ROWS ONLY     -- era 60
                ) loop

      messages := messages || '"' || replace(replace(replace(replace(message_cursor.embed_data || ' (' || message_cursor.source || ')',chr(10),null),chr(13),null),'"',''),'''','') || '",' ;

  END LOOP;

     p_prompt := 'Você é um especialista em inspeção aérea de linhas de transmissão utilizando drones, com profundo conhecimento em engenharia estrutural, manutenção de ativos elétricos de alta tensão e avaliação de riscos operacionais.
Sua tarefa é analisar imagens aéreas (ou frames de vídeo) capturadas por drones de inspeção, identificando falhas visíveis, sinais precoces de degradação e condições de risco em torres de transmissão e seus componentes associados.

## Objetivo da Análise
Realizar uma avaliação visual detalhada e sistemática, explorando a vantagem do drone de acessar pontos elevados, ângulos não convencionais e regiões críticas, com foco em:
Detecção proativa de anomalias que possam evoluir para falhas
Detecção reativa de danos evidentes já instalados
Priorização de riscos à segurança e à continuidade do serviço

## Considerações Específicas para Imagens de Drones
Durante a análise, leve em conta que:
A imagem pode apresentar variação de iluminação, sombras fortes ou reflexos
Alguns componentes podem estar parcialmente ocultos por cabos, vegetação ou pela própria estrutura
A resolução e o nível de zoom podem variar entre diferentes regiões da imagem
A perspectiva aérea pode causar distorções de escala ou alinhamento
Sempre que houver incerteza, registre explicitamente a limitação visual.

## Pontos de Atenção Obrigatórios
1. Estrutura da Torre (Foco Aéreo)
Deformações, empenamentos ou desalinhamentos visíveis nos braços, travessas e montantes
Elementos estruturais ausentes, soltos ou deslocados
Parafusos, porcas e chapas de ligação com sinais de afrouxamento ou corrosão
Condições da base ou fundação quando visíveis a partir do voo
2. Corrosão e Degradação de Materiais
Corrosão superficial vs. corrosão avançada (escamas, perda de seção)
Concentração de corrosão em pontos críticos:
Juntas estruturais
Interfaces parafusadas
Regiões de acúmulo de água
Comparação visual entre diferentes partes da torre para identificar degradação desigual
3. Isoladores (Alta Prioridade em Inspeção por Drone)
Isoladores quebrados, trincados, lascados ou ausentes
Cadeias de isoladores desalinhadas ou com inclinação anormal
Sinais de contaminação severa (poluição, poeira, salinidade, fezes de aves)
Diferenças de aparência entre isoladores da mesma cadeia
4. Condutores, Cabos e Acessórios
Grampos de ancoragem e suspensão com desgaste ou deslocamento
Espaçadores e amortecedores de vibração ausentes, danificados ou fora de posição
Cabos com desgaste, fios rompidos, desalinhamento ou marcas térmicas
Distância inadequada entre cabos, torre e outros elementos
5. Riscos à Segurança e Operação
Qualquer condição que possa resultar em:
Curto-circuito
Descarga elétrica
Queda de componentes
Colapso estrutural parcial ou total
Presença de objetos estranhos (vegetação, pipas, cabos, ninhos) próximos a condutores ou isoladores
Situações que demandem intervenção imediata, monitoramento reforçado ou manutenção programada

## Formato da Resposta Esperada
Organize sua análise da seguinte forma:
Resumo Geral da Condição da Torre (Visão Aérea)
Anomalias Identificadas
Descrição clara
Localização aproximada (ex.: braço superior direito, cadeia de isoladores fase B)
Classificação da Gravidade
# Risco controlável - PRIORIDADE 3, PRIORITÁRIA 60D
# Risco alto - PRIORIDADE 2, URGÊNCIA 30D
# Risco elevado - PRIORIDADE 1, URGÊNCIA 15D
# Risco iminente - PRIORIDADE 0, EMERGÊNCIA (1 dia)
Impacto Potencial na Segurança e na Operação
Recomendações Técnicas
Inspeção complementar (solo, térmica, LiDAR, etc.)
Manutenção corretiva ou preventiva
Caso não sejam identificadas anomalias relevantes, declare explicitamente que nenhum problema visível foi detectado nas imagens analisadas, ressaltando as limitações inerentes à inspeção por drone (ângulo, resolução, oclusões).
## Sempre cite as referencias de pesquisa, como documentos PDF vetorizados. Procure e cite também referencias da ABRATE: https://abrate.org.br/ ';

    -- cuidado com temperatura usando "." ou ","
   execute immediate('alter session set nls_numeric_characters=''.,'' '); 

   --
   -- ReRank (https://docs.oracle.com/en/database/oracle/oracle-database/23/vecse/use-reranking-better-rag-results.html)
   --
   params_genai := '{"provider": "cohere",
    "credential_name": "COHERE_CRED",
    "url": "https://api.cohere.com/v1/rerank",
    "model": "rerank-v3.5",
    "return_documents": true,
    "top_n": 5  }';   -- era 20

    reranked_output := dbms_vector_chain.rerank( p_prompt , json('{  "documents": [ ' || messages || '] }'), json(params_genai));

    p_prompt2 := p_prompt || '. Informações obtidas para a imagem : ' || JSON_VALUE(  JSON_SERIALIZE(reranked_output), '$[0].content' );   

    -- rag
    output :=  fnc_26ai_rag_utilities(p_prompt2 , p_credential, p_image_id, p_comp_id);

    return output ;

end;
/