package com.zioinfo.kintex.publicsite.assistant.dto;

import com.zioinfo.kintex.publicsite.dto.PublicGuideDtos.PublicCalendarEventDto;
import com.zioinfo.kintex.publicsite.dto.PublicGuideDtos.TransportInfoDto;
import com.zioinfo.kintex.publicsite.dto.PublicGuideDtos.VisitorGuideDto;

import java.util.List;

/**
 * 공개 AI 관람 도우미 요청·응답 DTO (비인증). 응답은 답변 + 근거 카드 + 인용 출처 + degraded 플래그를
 * 정직하게 담는다(환각 방지·투명성). 답변은 <b>조회된 DB 레코드만</b>을 근거로 생성한다.
 */
public final class VisitorAssistantDtos {

    private VisitorAssistantDtos() {
    }

    /** 관람 도우미 질문 요청. */
    public record AssistantRequest(String question) {
    }

    /**
     * 인용 출처(근거 레코드) — 프론트가 "출처 보기" 링크로 노출.
     *
     * @param type      근거 종류 — EVENT | TRANSPORT | GUIDE
     * @param id        참조 레코드 id
     * @param title     표시명(행사명 / 교통수단 / 가이드 제목)
     * @param sourceUrl 공개 출처 URL(있을 때만)
     */
    public record Citation(String type, String id, String title, String sourceUrl) {
    }

    /**
     * 관람 도우미 응답.
     *
     * @param question  질문 에코
     * @param answer    한국어 답변(근거 기반) — grounded=false 면 "찾지 못했습니다" 정직 응답
     * @param events    근거 행사 카드(연/월/상태)
     * @param transport 근거 교통 카드
     * @param guide     근거 방문가이드 카드
     * @param citations 인용 출처(레코드 id·source_url)
     * @param grounded  DB 근거를 실제로 찾았는지(false 면 답변 불가·환각 차단)
     * @param provider  응답 출처 — claude | ollama | search(AI 미가용 검색요약) | none(근거 없음)
     * @param degraded  AI 미가용으로 검색 요약/폴백으로 강등되었는지
     */
    public record AssistantResult(
            String question,
            String answer,
            List<PublicCalendarEventDto> events,
            List<TransportInfoDto> transport,
            List<VisitorGuideDto> guide,
            List<Citation> citations,
            boolean grounded,
            String provider,
            boolean degraded) {
    }
}
