package com.zioinfo.mall.rag;

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

import java.util.Map;

/**
 * Mall 최신 AI 기법(중앙 guardia-rag) 배선 API — 별개 레이어.
 *
 * <ul>
 *   <li>POST /api/mall/rag/recommend — 상품 추천·자연어 검색(/answer hybrid + /structured, 근거+보류)</li>
 *   <li>POST /api/mall/rag/demand-plan — 수요예측·재고이양 추천(/agent tool-use, 승인 게이트)</li>
 *   <li>POST /api/mall/rag/feedback — 👍/👎 피드백(/rag/feedback, solution=mall 격리)</li>
 *   <li>GET  /api/mall/rag/toggles — 현재 기법/신뢰도 토글 스냅샷</li>
 *   <li>PUT  /api/mall/rag/toggles/{key} — 토글 변경(MANAGER+, mall_setting 격리 저장)</li>
 * </ul>
 *
 * <p>기존 {@code /api/mall/ai/*} 는 불변. 본 컨트롤러는 중앙 경유 신규 경로만 추가한다.
 * RBAC: recommend/feedback 은 인증 사용자, demand-plan·토글 변경은 MANAGER+.
 */
@RestController
@RequestMapping("/api/mall/rag")
@RequiredArgsConstructor
public class RagController {

    private final MallRagAiService service;
    private final SettingService settingService;

    /** 상품 추천·자연어 검색 — 인증 고객(USER+). */
    @PostMapping("/recommend")
    public ApiResponse<Map<String, Object>> recommend(@RequestBody Map<String, Object> req, Authentication auth) {
        return ApiResponse.ok(service.recommend(req, auth.getName()));
    }

    /** 수요예측·재고이양 추천 — MANAGER+ (운영 의사결정). */
    @PostMapping("/demand-plan")
    @PreAuthorize("hasAnyRole('ADMIN','MANAGER')")
    public ApiResponse<Map<String, Object>> demandPlan(@RequestBody Map<String, Object> req, Authentication auth) {
        return ApiResponse.ok(service.demandPlan(req, auth.getName()));
    }

    /** 피드백 — 인증 사용자. */
    @PostMapping("/feedback")
    public ApiResponse<Map<String, Object>> feedback(@RequestBody Map<String, Object> req, Authentication auth) {
        return ApiResponse.ok(service.feedback(req, auth.getName()));
    }

    /** 토글 스냅샷 — 인증 사용자(읽기). */
    @GetMapping("/toggles")
    public ApiResponse<Map<String, Object>> toggles() {
        return ApiResponse.ok(service.currentToggles());
    }

    /**
     * 토글 변경 — 기존 mall_setting upsert(감사로그 자동 기록) 재사용. MANAGER+.
     * 허용 키는 {@code rag.*} 네임스페이스로 한정.
     */
    @PutMapping("/toggles/{key}")
    @PreAuthorize("hasAnyRole('ADMIN','MANAGER')")
    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());
    }
}
