package com.zioinfo.esn.config;

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

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;

/**
 * Ollama 온프레미스 AI 클라이언트.
 * 보안 불변 규칙: 외부 AI API 절대 금지 — Ollama localhost:11434만 허용.
 * 연결 실패 시 폴백 응답 반환(예외 미전파).
 */
@Slf4j
@Component
public class OllamaClient {

    @Value("${guardia.ollama-url:http://localhost:11434}")
    private String baseUrl;

    @Value("${guardia.ollama-text-model:llama3}")
    private String model;

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

    public String chat(String prompt) {
        return chat(prompt, "ESN AI 이상 분석 전문가 역할입니다.");
    }

    public String chat(String prompt, String systemPrompt) {
        try {
            var body = Map.of(
                "model", model,
                "messages", new Object[]{
                    Map.of("role", "system", "content", systemPrompt),
                    Map.of("role", "user",   "content", prompt)
                },
                "stream", false
            );
            String json = mapper.writeValueAsString(body);
            HttpRequest req = HttpRequest.newBuilder()
                .uri(URI.create(baseUrl + "/api/chat"))
                .header("Content-Type", "application/json")
                .POST(HttpRequest.BodyPublishers.ofString(json))
                .timeout(Duration.ofSeconds(120))
                .build();
            HttpResponse<String> resp = http.send(req, HttpResponse.BodyHandlers.ofString());
            if (resp.statusCode() == 200) {
                var res = mapper.readTree(resp.body());
                return res.path("message").path("content").asText("분석 결과를 생성했습니다.");
            }
            return fallback(prompt);
        } catch (Exception e) {
            log.warn("Ollama 연결 실패 — 폴백 응답 반환: {}", e.getMessage());
            return fallback(prompt);
        }
    }

    private String fallback(String prompt) {
        if (prompt.toLowerCase().contains("alarm") || prompt.contains("알람")) {
            return "알람 분석: 장치 연결 상태를 확인하고 네트워크 환경을 점검하세요. 지속 발생 시 현장 엔지니어 파견이 필요합니다.";
        }
        if (prompt.toLowerCase().contains("pos") || prompt.contains("가격")) {
            return "POS 데이터 분류: 정상 가격 변환 데이터입니다. 이상 감지된 항목은 수동 검토가 필요합니다.";
        }
        return "AI 분석 결과: 현재 시스템 상태를 검토하고 운영 매뉴얼을 참조하세요.";
    }
}
