package com.zioinfo.esn.ai.service;

import com.fasterxml.jackson.databind.ObjectMapper;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;

import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
import java.time.Duration;
import java.util.Map;

/**
 * 중앙 guardia-rag 학습 게이트로 피드백을 전달하는 얇은 클라이언트(온프레미스 localhost). [ZIOINFO-ESN]
 *
 * <p>로컬 DuckDB 저장과 <b>병행</b>해 중앙 rag {@code /feedback} 에 best-effort 전달한다(통합 학습·평가).
 * rag 미기동/실패는 무시한다(예외 미전파 — 사용자 피드백 저장 자체는 로컬로 성립). 외부 API 아님(내부 서비스).
 */
@Slf4j
@Service
public class RagFeedbackClient {

    @Value("${guardia.rag-url:http://localhost:8020}")
    private String ragUrl;

    private final HttpClient http = HttpClient.newBuilder()
            .connectTimeout(Duration.ofSeconds(3))
            .build();
    private final ObjectMapper mapper = new ObjectMapper();

    /** 피드백을 중앙 rag /feedback 로 전달(실패 무시). PII 마스킹은 호출 전에 수행되어야 한다. */
    public void forward(String feature, String question, String answer, String verdict, String correction) {
        try {
            String json = mapper.writeValueAsString(Map.of(
                    "solution", LearningStore.SOLUTION,
                    "feature", feature == null ? "" : feature,
                    "question", question == null ? "" : question,
                    "answer", answer == null ? "" : answer,
                    "verdict", verdict == null ? "" : verdict,
                    "correction", correction == null ? "" : correction));
            HttpRequest req = HttpRequest.newBuilder()
                    .uri(URI.create(ragUrl + "/feedback"))
                    .header("Content-Type", "application/json")
                    .timeout(Duration.ofSeconds(5))
                    .POST(HttpRequest.BodyPublishers.ofString(json))
                    .build();
            HttpResponse<String> resp = http.send(req, HttpResponse.BodyHandlers.ofString());
            if (resp.statusCode() / 100 != 2) {
                log.debug("중앙 rag 피드백 전달 비2xx({}) — 무시", resp.statusCode());
            }
        } catch (Exception e) {
            log.debug("중앙 rag 피드백 전달 실패(무시): {}", e.getClass().getSimpleName());
        }
    }
}
