package org.dromara.ai.controller.admin;

import cn.dev33.satoken.annotation.SaCheckPermission;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.tags.Tag;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.dromara.ai.monitor.AiMonitorService;
import org.dromara.ai.provider.AiProvider;
import org.dromara.ai.provider.AiProviderManager;
import org.dromara.common.core.domain.R;
import org.dromara.common.web.core.BaseController;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;

import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

/**
 * AI提供商管理
 *
 * @author pengles
 */
@Tag(name = "管理端-AI提供商管理", description = "AI提供商管理和监控接口")
@Slf4j
@Validated
@RequiredArgsConstructor
@RestController
@RequestMapping("/ai/provider")
public class AdminAiProviderController extends BaseController {
    
    private final AiProviderManager providerManager;
    private final AiMonitorService monitorService;

    /**
     * 获取所有提供商列表
     */
    @Operation(summary = "提供商列表", description = "获取所有已注册的AI服务提供商信息")
    @SaCheckPermission("ai:provider:list")
    @GetMapping("/list")
    public R<List<Map<String, Object>>> list() {
        try {
            List<Map<String, Object>> items = providerManager.getAllProviders().stream().map(p -> Map.of(
                    "name", p.getProviderName(),
                    "type", p.getProviderType().getCode(),
                    "version", p.getVersion(),
                    "available", p.isAvailable(),
                    "statistics", p.getStatistics()
            )).collect(Collectors.toList());
            log.debug("获取提供商列表，共{}个提供商", items.size());
            return R.ok(items);
        } catch (Exception e) {
            log.error("获取提供商列表失败", e);
            return R.fail("获取提供商列表失败: " + e.getMessage());
        }
    }

    /**
     * 获取支持的模型列表
     */
    @Operation(summary = "支持的模型列表", description = "获取所有提供商支持的所有模型信息")
    @SaCheckPermission("ai:provider:list")
    @GetMapping("/models")
    public R<List<Object>> models() {
        try {
            List<Object> models = providerManager.getAllSupportedModels().stream().map(m -> Map.of(
                    "id", m.getId(),
                    "name", m.getName(),
                    "provider", m.getProvider(),
                    "capabilities", m.getCapabilities(),
                    "type", m.getType() != null ? m.getType().getCode() : null
            )).collect(Collectors.toList());
            log.debug("获取模型列表，共{}个模型", models.size());
            return R.ok(models);
        } catch (Exception e) {
            log.error("获取模型列表失败", e);
            return R.fail("获取模型列表失败: " + e.getMessage());
        }
    }

    /**
     * 获取默认提供商
     */
    @Operation(summary = "获取默认提供商", description = "获取当前系统默认的AI服务提供商")
    @SaCheckPermission("ai:provider:query")
    @GetMapping("/default")
    public R<Map<String, Object>> getDefault() {
        try {
            AiProvider p = providerManager.getDefaultProvider();
            if (p == null) {
                log.warn("未设置默认提供商");
                return R.fail("NO_DEFAULT_PROVIDER");
            }
            return R.ok(Map.of("name", p.getProviderName(), "version", p.getVersion(), "type", p.getProviderType().getCode()));
        } catch (Exception e) {
            log.error("获取默认提供商失败", e);
            return R.fail("获取默认提供商失败: " + e.getMessage());
        }
    }

    /**
     * 设置默认提供商
     */
    @Operation(summary = "设置默认提供商", description = "设置系统默认的AI服务提供商")
    @SaCheckPermission("ai:provider:edit")
    @PostMapping("/setDefault")
    public R<Void> setDefault(@Parameter(description = "提供商名称") @RequestParam String name) {
        try {
            providerManager.setDefaultProvider(name);
            log.info("设置默认提供商: {}", name);
            return R.ok();
        } catch (Exception e) {
            log.error("设置默认提供商失败: {}", name, e);
            return R.fail("设置默认提供商失败: " + e.getMessage());
        }
    }

    /**
     * 获取系统统计信息
     */
    @Operation(summary = "系统统计", description = "获取系统级别的AI使用统计信息")
    @SaCheckPermission("ai:provider:query")
    @GetMapping("/stats/system")
    public R<Map<String, Object>> getSystemStats() {
        try {
            Map<String, Object> stats = monitorService.getSystemStats();
            return R.ok(stats);
        } catch (Exception e) {
            log.error("获取系统统计失败", e);
            return R.fail("获取系统统计失败: " + e.getMessage());
        }
    }

    /**
     * 获取各Provider统计信息
     */
    @Operation(summary = "Provider统计", description = "获取所有Provider的使用统计信息")
    @SaCheckPermission("ai:provider:query")
    @GetMapping("/stats/providers")
    public R<List<Map<String, Object>>> getProviderStats() {
        try {
            List<Map<String, Object>> stats = monitorService.getAllProviderStats();
            return R.ok(stats);
        } catch (Exception e) {
            log.error("获取Provider统计失败", e);
            return R.fail("获取Provider统计失败: " + e.getMessage());
        }
    }

    /**
     * 重置统计信息
     */
    @Operation(summary = "重置统计", description = "重置所有提供商的统计信息")
    @SaCheckPermission("ai:provider:edit")
    @PostMapping("/stats/reset")
    public R<Void> resetStats() {
        try {
            monitorService.resetStats();
            providerManager.resetAllStatistics();
            log.info("重置统计信息成功");
            return R.ok();
        } catch (Exception e) {
            log.error("重置统计失败", e);
            return R.fail("重置统计失败: " + e.getMessage());
        }
    }
}
