package com.zioinfo.kintex.ai.nlquery.dto;

import java.util.List;
import java.util.Map;

/**
 * F092 자연어 조회 / F025 규정 챗봇 요청·응답 DTO 모음.
 * 응답은 항상 산출 출처(provider·degraded)와 근거(생성 SQL / 인용 룰)를 정직하게 담는다(투명성·환각 방지).
 */
public final class NlQueryDtos {

    private NlQueryDtos() {
    }

    /** 자연어 조회 요청. */
    public record NlQueryRequest(String question) {
    }

    /**
     * 자연어 조회 결과.
     *
     * @param question 사용자 질문(에코)
     * @param sql      실제 실행된(가드 통과) SQL — 투명성 위해 반드시 노출
     * @param tables   참조 테이블(가드 검증 근거)
     * @param columns  결과 컬럼 순서
     * @param rows     결과 행(각 행 컬럼→값)
     * @param rowCount 행 수
     * @param provider AI provider("claude"|"ollama")
     */
    public record NlQueryResult(
            String question,
            String sql,
            List<String> tables,
            List<String> columns,
            List<Map<String, Object>> rows,
            int rowCount,
            String provider) {
    }

    /** 규정 챗봇 요청. */
    public record RulesChatRequest(String question) {
    }

    /** 인용 룰 항목(근거). */
    public record RuleCitation(String code, String label, String detail) {
    }

    /**
     * 규정 챗봇 응답.
     *
     * @param question  사용자 질문(에코)
     * @param answer    답변(근거 룰 인용 필수 · 근거 없으면 정직 응답)
     * @param citations 근거 룰 항목(키/값)
     * @param grounded  근거 룰을 실제로 찾았는지(false 면 "규정에서 찾지 못함")
     * @param provider  응답 출처("claude"|"ollama"|"rules"|"none")
     * @param degraded  AI 미가용으로 규칙 기반 요약으로 강등되었는지
     */
    public record RulesChatResult(
            String question,
            String answer,
            List<RuleCitation> citations,
            boolean grounded,
            String provider,
            boolean degraded) {
    }
}
