package com.zioinfo.signage.controller;

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

/**
 * SIGNAGE 텍스트 AI 진입점 — 간판 장애 원인분석 · 간판 문구 생성 · 광고 편성 추천.
 *
 * <p><b>provider 라우팅</b>: {@link AiTextRouter} 를 경유해 Claude(외부, 키 설정 시)↔Ollama(온프레미스,
 * qwen3/deepseek/glm/기존소형)를 런타임 선택한다. 라우터가 degraded 를 반환하면(키 미설정·전 provider 실패)
 * 기존 {@link OllamaClient#chat} 규칙기반 폴백으로 최종 방어 — 응답은 항상 비어있지 않다(무회귀).
 *
 * <p>보안 불변: 외부 AI 는 Claude(소유자 승인 예외) 단일 경로. 그 외 외부 호출 금지. 키/스택 미노출.
 */
@RestController
@RequestMapping("/api/ai")
@RequiredArgsConstructor
public class AiController {

    private final AiTextRouter aiRouter;
    private final OllamaClient ollama;

    /**
     * 간판/게이트웨이 장애 원인분석 — 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 system = "당신은 전자간판(e-SignBoard) 중앙관제 전문 AI 엔지니어입니다. 게이트웨이·ESB 태그·디스플레이 장애를 분석하고 실용적 조치를 제안하세요.";
        String prompt = String.format(
            "전자간판 장애 분석:\n유형: %s\n심각도: %s\n메시지: %s\n\n" +
            "원인 분석 및 조치 방안을 3줄 이내로 간결하게 제시하세요.",
            alarmType, severity, message
        );

        String result = routeOrFallback(system, prompt);
        return ApiResponse.ok(Map.of("analysis", result, "alarmType", alarmType, "severity", severity));
    }

    /**
     * 간판 문구 생성 — 상호/업종/톤 기반 간판 문구 후보(provider 라우팅, 실패 시 규칙기반 폴백).
     */
    @PostMapping("/generate-sign-text")
    public ApiResponse<Map<String, String>> generateSignText(@RequestBody Map<String, Object> body) {
        String bizName = (String) body.getOrDefault("bizName", "");
        String industry = (String) body.getOrDefault("industry", "");
        String tone = (String) body.getOrDefault("tone", "심플하고 고급스럽게");

        String system = "당신은 전자간판 카피라이터 AI 입니다. 도시 미관과 조화되는 간결한 간판 문구를 제안합니다.";
        String prompt = String.format(
            "간판 문구 생성:\n상호: %s\n업종: %s\n톤: %s\n\n" +
            "표시하기 좋은 간판 문구 후보 3개를 짧게 제시하세요.",
            bizName, industry, tone
        );

        String result = routeOrFallback(system, prompt);
        return ApiResponse.ok(Map.of("bizName", bizName, "suggestions", result));
    }

    /**
     * 광고 편성 추천 — 매장/시간대/업종 기반 주기 광고 편성 추천(provider 라우팅, 실패 시 규칙기반 폴백).
     */
    @PostMapping("/recommend-ad")
    public ApiResponse<Map<String, String>> recommendAd(@RequestBody Map<String, Object> body) {
        String storeCode = String.valueOf(body.getOrDefault("storeCode", ""));
        String context = (String) body.getOrDefault("context", "");

        String system = "당신은 전자간판 광고 편성 AI 입니다. 매장 특성과 시간대를 고려해 광고 편성을 추천합니다.";
        String prompt = String.format(
            "광고 편성 추천:\n매장코드: %s\n상황/특성: %s\n\n" +
            "시간대별 광고 편성 전략을 3줄 이내로 제시하세요.",
            storeCode, context
        );

        String result = routeOrFallback(system, prompt);
        return ApiResponse.ok(Map.of("storeCode", storeCode, "recommendation", result));
    }

    /**
     * 일반 AI 채팅 — 전자간판 운영 관련 질문(provider 라우팅, 실패 시 규칙기반 폴백).
     */
    @PostMapping("/chat")
    public ApiResponse<Map<String, String>> chat(@RequestBody Map<String, String> body) {
        String message = body.getOrDefault("message", "");
        String system = "전자간판(e-SignBoard) 중앙관제 플랫폼 운영 전문가입니다.";
        String result = routeOrFallback(system, message);
        return ApiResponse.ok(Map.of("response", result));
    }

    /**
     * 라우터(Claude↔Ollama) 경유 → degraded 면 기존 OllamaClient.chat 규칙기반 폴백.
     * 시스템 지시는 프롬프트 앞에 병합(단일 user 메시지 계약). 응답은 항상 비어있지 않다.
     */
    private String routeOrFallback(String system, String prompt) {
        String merged = (system == null || system.isBlank()) ? prompt : system + "\n\n" + prompt;
        GenResult r = aiRouter.generate(merged);
        if (!r.degraded() && r.text() != null && !r.text().isBlank()) {
            return r.text();
        }
        return ollama.chat(prompt, system);
    }
}
