package com.arms.api.chat.controller;

import com.arms.api.chat.model.dto.ChatDTO;
import com.arms.api.chat.service.ChatServiceImpl;
import com.arms.egovframework.javaservice.aigenerate.l_query.controller.UserQueryAbstractController;
import com.arms.egovframework.javaservice.aigenerate.v_prompt.model.PromptContextVO;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;
import reactor.core.publisher.Flux;
import reactor.core.publisher.Mono;

@Slf4j
@RestController
@RequestMapping("/chat")
@Tag(name = "ChatController", description = "Chat AI 파이프라인 컨트롤러")
public class ChatController
        extends UserQueryAbstractController<ChatServiceImpl, ChatDTO> {

    @Autowired
    public ChatController(ChatServiceImpl service) {
        setQueryService(service);
    }

    @Operation(summary = "[Context] 파이프라인 컨텍스트 조회",
               description = "RAG · Keyword · SearchEngine 결과를 조합한 컨텍스트를 반환합니다. LLM 호출 없음.")
    @PostMapping("/context")
    public Mono<ResponseEntity<PromptContextVO>> context(@RequestBody ChatDTO query) {
        return getQueryService().buildContext(query).map(ResponseEntity::ok);
    }

    @Operation(summary = "[Execute] 전체 파이프라인 스트리밍",
               description = "RAG → Keyword 추출 → SearchEngine → LLM 응답을 스트리밍으로 반환합니다.")
    @PostMapping(value = "/execute-stream", produces = MediaType.TEXT_EVENT_STREAM_VALUE)
    public Flux<String> executeStream(@RequestBody ChatDTO query) {

        log.info("ChatController :: executeStream | sessionId={}", query.getSessionId());

        if (!query.isValid()) {
            return Flux.error(new IllegalArgumentException("queryText 가 비어 있습니다."));
        }

        return getQueryService().executeStream(query);
    }
}
