package com.zioinfo.mes.rag;

import com.zioinfo.mes.admin.SettingService;
import com.zioinfo.mes.common.ApiResponse;
import lombok.RequiredArgsConstructor;
import org.springframework.security.core.Authentication;
import org.springframework.web.bind.annotation.*;

import java.util.Map;

/**
 * MES 최신 AI 기법(중앙 guardia-rag) 배선 API — 별개 레이어.
 *
 * <p>기존 {@code /api/mes/ai/*}(AiController, 8개 제조 AI)는 <b>불변</b>. 본 컨트롤러는 중앙 경유
 * 신규 경로만 추가한다. RBAC 은 {@code SecurityConfig} 가 통제(POST=Worker+, 토글 PUT=Manager+).
 *
 * <ul>
 *   <li>POST /api/mes/rag/defect-analysis  — 불량 RCA + SPC 이상감지(/agent+/structured, SPC 수치는 결정론)</li>
 *   <li>POST /api/mes/rag/predict-analysis — 설비 예지보전 + 수요/생산 예측(/agent, 수치는 결정론 베이스라인)</li>
 *   <li>POST /api/mes/rag/feedback         — 👍/👎 피드백(/rag/feedback, solution=mes 격리)</li>
 *   <li>GET  /api/mes/rag/toggles          — 현재 기법 토글 스냅샷</li>
 *   <li>PUT  /api/mes/rag/toggles/{key}    — 토글 변경(Manager+, mes_setting 격리 저장)</li>
 * </ul>
 */
@RestController
@RequestMapping("/api/mes/rag")
@RequiredArgsConstructor
public class RagController {

    private final RagMesService service;
    private final SettingService settingService;

    @PostMapping("/defect-analysis")
    public ApiResponse<Map<String, Object>> defectAnalysis(@RequestBody Map<String, Object> req, Authentication auth) {
        return ApiResponse.ok(service.defectAnalysis(req, name(auth)));
    }

    @PostMapping("/predict-analysis")
    public ApiResponse<Map<String, Object>> predictAnalysis(@RequestBody Map<String, Object> req, Authentication auth) {
        return ApiResponse.ok(service.predictAnalysis(req, name(auth)));
    }

    @PostMapping("/feedback")
    public ApiResponse<Map<String, Object>> feedback(@RequestBody Map<String, Object> req, Authentication auth) {
        return ApiResponse.ok(service.feedback(req, name(auth)));
    }

    @GetMapping("/toggles")
    public ApiResponse<Map<String, Object>> toggles() {
        return ApiResponse.ok(service.currentToggles());
    }

    /**
     * 토글 변경 — 기존 mes_setting upsert(감사로그 자동 기록) 재사용. RBAC 은 SecurityConfig 통제.
     * 허용 키는 {@code rag.*} 네임스페이스로 한정(다른 설정 보호).
     */
    @PutMapping("/toggles/{key}")
    public ApiResponse<Map<String, Object>> updateToggle(@PathVariable String key,
                                                         @RequestBody Map<String, Object> req) {
        if (key == null || !key.startsWith("rag.")) {
            return ApiResponse.fail("ERR-RAG-400: rag.* 키만 변경 가능");
        }
        Object v = req.get("value");
        settingService.update(key, v == null ? "" : String.valueOf(v));
        return ApiResponse.ok(service.currentToggles());
    }

    private String name(Authentication auth) {
        return auth == null ? "anon" : auth.getName();
    }
}
