-- Runtime Few-shots remain semantic vector retrieval. Customer examples are
-- governed by their DB approval state, not restricted to exact text matches.

UPDATE sg_qa_vector_example
   SET reference_status = 'APPROVED',
       reference_kind = 'SQL_TEMPLATE',
       target_type = 'SINGLE',
       object_role = 'GAME_GOODS_HOLDINGS',
       inspection_status = 'VERIFIED',
       inspection_note = 'Verified CZN-07 semantic Few-shot. Use goods holdings, crystal dimension, RU_FLAG=1, excluded-user filter, nonzero holdings, and daily grouping.',
       verified_at = SYSTIMESTAMP,
       verified_by = 'SGMP_POC_METADATA_REVIEW'
 WHERE source_type = 'CUSTOMER_QA_BENCHMARK'
   AND source_case_id = 'CZN-07'
/

CREATE OR REPLACE FUNCTION sg_qa_vector_search(
  p_question    IN CLOB,
  p_top_k       IN PLS_INTEGER DEFAULT 3,
  p_target_type IN VARCHAR2 DEFAULT 'ANY'
) RETURN SYS_REFCURSOR AUTHID DEFINER
IS
  v_query_vector VECTOR;
  v_results SYS_REFCURSOR;
  v_target_type VARCHAR2(16) := UPPER(TRIM(NVL(p_target_type, 'ANY')));
  v_max_cosine_distance NUMBER;
BEGIN
  IF p_question IS NULL THEN RAISE_APPLICATION_ERROR(-20003, 'question is required.'); END IF;
  IF p_top_k IS NULL OR p_top_k < 1 OR p_top_k > 20 THEN
    RAISE_APPLICATION_ERROR(-20004, 'top_k must be between 1 and 20.');
  END IF;
  IF v_target_type NOT IN ('NONE', 'SINGLE', 'MULTI', 'ALL', 'ANY') THEN
    RAISE_APPLICATION_ERROR(-20005, 'invalid target type.');
  END IF;

  SELECT number_value INTO v_max_cosine_distance
    FROM sg_game_scope_policy
   WHERE policy_key = 'QA_VECTOR_MAX_COSINE_DISTANCE'
     AND active_yn = 'Y'
     AND number_value IS NOT NULL;

  v_query_vector := DBMS_VECTOR.UTL_TO_EMBEDDING(
    p_question, JSON(sg_qa_vector_params('search_query'))
  );

  OPEN v_results FOR
    SELECT example_id, question, answer_sql, answer_text, embedding_model,
           reference_kind, target_type, object_role, source_case_id, source_type,
           cosine_distance
      FROM (
        SELECT example_id, question, answer_sql, answer_text, embedding_model,
               reference_kind, target_type, object_role, source_case_id, source_type,
               VECTOR_DISTANCE(embedding, v_query_vector, COSINE) AS cosine_distance
          FROM sg_qa_vector_example
         WHERE reference_status = 'APPROVED'
           AND inspection_status = 'VERIFIED'
           AND answer_sql IS NOT NULL
           AND (source_type = 'POLICY_TEMPLATE'
                OR NOT REGEXP_LIKE(answer_sql, '<[A-Z][A-Z0-9_]*>', 'i'))
           AND (target_type = 'ANY' OR v_target_type = 'ANY' OR target_type = v_target_type)
      )
     WHERE cosine_distance <= v_max_cosine_distance
     ORDER BY cosine_distance, example_id
     FETCH FIRST p_top_k ROWS ONLY;
  RETURN v_results;
END;
/

COMMIT
