package com.zioinfo.esn.controller;

import com.zioinfo.esn.ai.service.AiTextRouter;
import com.zioinfo.esn.common.ApiResponse;
import com.zioinfo.esn.common.ai.TextAiClient.GenResult;
import lombok.RequiredArgsConstructor;
import org.springframework.web.bind.annotation.*;
import java.util.Map;

/**
 * ESN AI 진입점 — 알람분석·POS분류·채팅. [ZIOINFO-ESN]
 *
 * <p>기존 {@code OllamaClient} 직접 호출을 {@link AiTextRouter} 경유로 전환한다(provider=claude 선택 시
 * Claude, 실패/미설정 시 Ollama 자동 폴백). 라우터가 degraded 를 반환하면 기존과 동일한 규칙기반 폴백
 * 문구를 유지한다(무회귀). systemPrompt 는 프롬프트 앞에 문맥으로 병합한다.
 */
@RestController
@RequestMapping("/api/ai")
@RequiredArgsConstructor
public class AiController {

    private final AiTextRouter aiRouter;

    /** 알람 AI 이상 분석 — provider 라우팅(Claude↔Ollama). */
    @PostMapping("/analyze-alarm")
    public ApiResponse<Map<String, String>> analyzeAlarm(@RequestBody Map<String, Object> body) {
        String alarmType = (String) body.getOrDefault("alarmType", "UNKNOWN");
        String message   = (String) body.getOrDefault("message", "");
        String severity  = (String) body.getOrDefault("severity", "LOW");

        String prompt = "당신은 ESL(전자 가격표) 시스템 전문 AI 엔지니어입니다. 알람을 분석하고 실용적인 조치를 제안하세요.\n\n"
                + String.format(
                "ESL 장치 알람 분석:\n유형: %s\n심각도: %s\n메시지: %s\n\n"
                + "원인 분석 및 조치 방안을 3줄 이내로 간결하게 제시하세요.",
                alarmType, severity, message);

        String result = generateOr(prompt,
                "알람 분석: 장치 연결 상태를 확인하고 네트워크 환경을 점검하세요. 지속 발생 시 현장 엔지니어 파견이 필요합니다.");

        return ApiResponse.ok(Map.of("analysis", result, "alarmType", alarmType, "severity", severity));
    }

    /** POS 데이터 AI 분류 — 이상 데이터 자동 감지. */
    @PostMapping("/classify-pos")
    public ApiResponse<Map<String, String>> classifyPos(@RequestBody Map<String, Object> body) {
        String productCode = (String) body.getOrDefault("productCode", "");
        String price       = String.valueOf(body.getOrDefault("price", "0"));
        String salePrice   = String.valueOf(body.getOrDefault("salePrice", "0"));

        String prompt = "당신은 POS 데이터 품질 관리 AI입니다. 가격 데이터의 이상을 감지하세요.\n\n"
                + String.format(
                "POS 가격 데이터 검증:\n상품코드: %s\n정가: %s\n판매가: %s\n\n"
                + "이 데이터가 정상인지 이상(오류/이상값)인지 판단하고, 분류(NORMAL/ABNORMAL)와 이유를 2줄 이내로 제시하세요.",
                productCode, price, salePrice);

        String result = generateOr(prompt,
                "POS 데이터 분류: 정상 가격 변환 데이터입니다. 이상 감지된 항목은 수동 검토가 필요합니다.");

        String classification = result.toUpperCase().contains("ABNORMAL") ? "ABNORMAL" : "NORMAL";

        return ApiResponse.ok(Map.of(
                "classification", classification,
                "analysis", result,
                "productCode", productCode
        ));
    }

    /** 일반 AI 채팅 — ESN 운영 관련 질문. */
    @PostMapping("/chat")
    public ApiResponse<Map<String, String>> chat(@RequestBody Map<String, String> body) {
        String message = body.getOrDefault("message", "");
        String prompt = "ESL 전자 가격표 통합 관리 플랫폼 운영 전문가입니다.\n\n" + message;
        String result = generateOr(prompt,
                "AI 분석 결과: 현재 시스템 상태를 검토하고 운영 매뉴얼을 참조하세요.");
        return ApiResponse.ok(Map.of("response", result));
    }

    /** 라우터 생성 → degraded/빈응답 시 기존 규칙기반 폴백 문구(무회귀). */
    private String generateOr(String prompt, String ruleFallback) {
        GenResult r = aiRouter.generate(prompt);
        if (!r.degraded() && r.text() != null && !r.text().isBlank()) {
            return r.text();
        }
        return ruleFallback;
    }
}
