create or replace procedure prc_26ai_vulnerabilidade (p_rowid in varchar default null,
                                                      p_oci_cred  IN VARCHAR2 default 'OCI_CRED',
                                                      p_comp in varchar2,
                                                      p_response out clob,
                                                      p_json out clob )
/*


Para testes de carga, ou associacao a jobs:

declare
v_resp clob;
v_json clob;
begin
for r1 in (select rowid cid from TB_26AI_TECH_VULNERABILIDADE where insight_report is null ) loop
 prc_26ai_vulnerabilidade (p_rowid => r1.cid ,
                           p_oci_cred => 'OCI_CRED',
                           p_comp => 'ocid1.compartment.oc1..aaaaaaaayv4jpgnurtdpxwfy3t2tak6akpyh6jgunlc6pdmilqv5f2s5nevq',
                           p_response => v_resp,
                           p_json => v_json );
end loop;                           
end;

*/
as
  v_pre_prompt clob;
  v_customer_data clob; 
  v_pre_prompt_json clob;
begin

    v_pre_prompt :='Você é um analista sênior de dados e operações. 
Sua tarefa é interpretar os dados, comparar os resultados e produzir um relatório executivo e técnico acionável.

Objetivo:
Gerar insights em 4 blocos:
1) Análise
2) Diagnóstico
3) Recomendações
4) Plano de ação

Regras de qualidade:
- Não invente dados ausentes. Quando faltar contexto, declare explicitamente “Informação não fornecida”.
- Seja específico, com linguagem executiva + técnica.
- Priorize risco real de negócio e explorabilidade.
- Sempre indicar severidade e prioridade.
- Sempre incluir ações de curto, médio e longo prazo.
- Quando possível, referenciar boas práticas (OWASP, NIST, CIS, CVE/CWE).

Formato obrigatório da resposta:
## 1. Análise
- Resumo executivo (5 a 8 linhas)
- Principais métricas observadas
- Pontos fora do padrão (outliers/anomalias)

## 2. Diagnóstico
- Causas prováveis por ordem de impacto (Alta/Média/Baixa)
- Evidências que sustentam cada causa (referenciando campos do JSON)
- Riscos de curto e médio prazo se nada for feito

## 3. Recomendações
Para cada recomendação, informe:
- Ação recomendada
- Problema que resolve
- Impacto esperado
- Esforço estimado (Baixo/Médio/Alto)
- Prioridade (P1/P2/P3)

## 4. Plano de ação (30-60-90 dias)
- 30 dias: ações imediatas e “quick wins”
- 60 dias: ajustes estruturais
- 90 dias: consolidação e otimização
Para cada etapa, incluir:
- Responsável sugerido (perfil/função)
- Dependências
- Métrica de sucesso (KPI)
- Critério de conclusão';


v_pre_prompt_json := '## FORMATO DE SAÍDA JSON
Quando solicitado no modo JSON, responda EXCLUSIVAMENTE com o objeto JSON 
válido conforme o schema abaixo, sem texto antes ou depois, sem markdown, 
sem blocos de código. O JSON deve ser parseable diretamente.
Campos não avaliáveis por qualidade de imagem devem receber null.
Não inclua explicações, texto introdutório, saudações ou blocos de Markdown como "```json" no comeco nem no final como "```".

## Exemplo JSON:
Retorne um JSON válido (sem comentários), espelhando o relatório:
{
  "id": "",
  "titulo": "",
  "analise": {
    "resumo_tecnico": "",
    "vetor_ataque": "",
    "pre_condicoes": [],
    "impacto_cia": {
      "confidencialidade": "",
      "integridade": "",
      "disponibilidade": ""
    }
  },
  "diagnostico": {
    "causa_raiz": "",
    "classificacao": {
      "cwe": "",
      "owasp": ""
    },
    "severidade": "",
    "probabilidade_exploracao": "",
    "impacto_negocio": "",
    "prioridade_final": "",
    "justificativa": ""
  },
  "recomendacoes": [
    {
      "acao": "",
      "tipo": "corretiva|preventiva|detectiva",
      "esforco": "baixo|medio|alto",
      "dependencias": []
    }
  ],
  "plano_acao": [
    {
      "prazo": "curto|medio|longo",
      "etapa": "",
      "responsavel_sugerido": "",
      "deadline_sugerido": "",
      "resultado_esperado": "",
      "criterio_aceite": ""
    }
  ],
  "lacunas_informacao": []
}';

    select json_object(a.*) my_json 
     into v_customer_data
    from TB_26AI_TECH_VULNERABILIDADE a 
     where rowid = p_rowid
      and insight_report is null ;
      
        p_response := FNC_26ai_rag( p_ai_prompt => v_pre_prompt || '. Dados: ' || v_customer_data,
                      p_oci_cred => p_oci_cred,
                      p_comp => p_comp
                    );

        p_json :=  replace( replace( FNC_26ai_rag( p_ai_prompt => 'MODO JSON: ' || v_pre_prompt || ' ' || v_pre_prompt_json || '. Dados: ' || v_customer_data,
                      p_oci_cred => p_oci_cred,
                      p_comp => p_comp
                    ) ,'```json','' ),'```','' );

       update TB_26AI_TECH_VULNERABILIDADE
       set insight_report = p_response,
           insight_json =  p_json    
       where rowid = p_rowid;

       -- vetorizacao do relatorio gerado  
       insert into TB_26AI_TECH_VULNERABILIDADE_VECTOR
            SELECT  et.embed_id,
                    et.text_chunk,
                    et.embed_vector,
                    null,
                    p_rowid
                FROM TB_26AI_TECH_VULNERABILIDADE 
                CROSS JOIN TABLE(
                    DBMS_VECTOR_CHAIN.UTL_TO_EMBEDDINGS(
                        DBMS_VECTOR_CHAIN.UTL_TO_CHUNKS(
                             insight_report ,  
                            JSON('{"by":"words","max":"1000","split":"sentence","normalize":"all","overlap":"0"}')
                        ),
                        json('{ "provider": "ocigenai",
                                "credential_name": "' || p_oci_cred || '",
                                "url": "https://inference.generativeai.us-chicago-1.oci.oraclecloud.com/20231130/actions/embedText",
                                "model": "cohere.embed-v4.0"
                            }')
                    )
                ) t
                CROSS JOIN JSON_TABLE(
                    t.column_value, '$[*]'
                    COLUMNS (
                        embed_id     NUMBER         PATH '$.embed_id',
                        text_chunk   VARCHAR2(4000) PATH '$.embed_data',
                        embed_vector CLOB           PATH '$.embed_vector'
                    )
                ) AS et;
       commit;          
                    
end;
/