package com.zioinfo.esn.ai.controller;

import com.zioinfo.esn.ai.dto.AiConfigDto;
import com.zioinfo.esn.ai.dto.AiConfigUpdateRequest;
import com.zioinfo.esn.ai.service.AiConfigService;
import com.zioinfo.esn.common.ApiResponse;
import lombok.RequiredArgsConstructor;
import org.springframework.security.core.Authentication;
import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.PutMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.time.LocalDateTime;

/**
 * AI 플랫폼(LLM provider) 설정 관리(ADMIN). [ZIOINFO-ESN]
 * SecurityConfig {@code /api/admin/** hasRole(ADMIN)} 게이트로 보호된다.
 *
 * <p>esn_setting(key='ai.*')에 저장된 런타임 설정을 조회/갱신/테스트한다. <b>API 키는 환경변수
 * (ANTHROPIC_API_KEY)로만 주입</b>되어 응답·로그에 노출되지 않는다(GET 은 {@code claudeKeySet} 불리언만).
 * 설정 변경은 재기동 없이 다음 AI 호출부터 반영된다.
 *
 * <ul>
 *   <li>GET  /api/admin/ai-config        현재 효과 설정(키 값 제외, keySet 불리언만)</li>
 *   <li>PUT  /api/admin/ai-config        provider/모델 갱신(화이트리스트 검증)</li>
 *   <li>POST /api/admin/ai-config/test   저장 설정 기준 선택 provider 연결 테스트(요약 결과만)</li>
 * </ul>
 */
@RestController
@RequestMapping("/api/admin/ai-config")
@RequiredArgsConstructor
public class AiConfigController {

    private final AiConfigService service;

    @GetMapping
    public ApiResponse<AiConfigDto> get() {
        return ApiResponse.ok(service.getConfig());
    }

    @PutMapping
    public ApiResponse<AiConfigDto> update(@RequestBody AiConfigUpdateRequest req) {
        return ApiResponse.ok(service.update(req, currentActor()));
    }

    @PostMapping("/test")
    public ApiResponse<AiConfigService.TestResult> test() {
        AiConfigService.TestResult result = service.test();
        return result.ok()
                ? ApiResponse.ok(result)
                : new ApiResponse<>(false, result.message(), result, LocalDateTime.now());
    }

    /** 감사 로그용 현재 사용자명(미인증 시 SYSTEM). */
    private static String currentActor() {
        Authentication a = SecurityContextHolder.getContext().getAuthentication();
        return (a != null && a.getName() != null) ? a.getName() : "SYSTEM";
    }
}
