package com.infoepoch.pms.agent.platform.model.adapter.in.web;

import com.infoepoch.pms.agent.platform.model.adapter.in.web.dto.ProviderTypeResponse;
import com.infoepoch.pms.agent.platform.model.application.ModelProviderService;
import com.infoepoch.pms.agent.platform.model.application.dto.CreateProviderRequest;
import com.infoepoch.pms.agent.platform.model.application.dto.ProviderResponse;
import com.infoepoch.pms.agent.platform.model.application.dto.UpdateProviderRequest;
import com.infoepoch.pms.agent.platform.model.domain.ProviderType;
import com.infoepoch.pms.agent.platform.shared.response.Result;
import jakarta.validation.Valid;
import lombok.RequiredArgsConstructor;
import org.springframework.web.bind.annotation.*;

import java.util.Arrays;
import java.util.List;

/**
 * 模型供应商控制器。
 */
@RestController
@RequestMapping("/api/admin/providers")
@RequiredArgsConstructor
public class ModelProviderController {

    private final ModelProviderService providerService;

    /**
     * 查询全部供应商。
     *
     * @return 供应商列表
     */
    @GetMapping
    public Result<List<ProviderResponse>> listAll() {
        return Result.success(providerService.listAll());
    }

    /**
     * 查询供应商类型枚举。
     *
     * @return 供应商类型列表
     */
    @GetMapping("/types")
    public Result<List<ProviderTypeResponse>> listTypes() {
        return Result.success(Arrays.stream(ProviderType.values())
                .map(ProviderTypeResponse::new)
                .toList());
    }

    /**
     * 创建供应商。
     *
     * @param req 创建请求
     * @return 创建后的供应商
     */
    @PostMapping
    public Result<ProviderResponse> create(@Valid @RequestBody CreateProviderRequest req) {
        return Result.success(providerService.create(req));
    }

    /**
     * 按 ID 查询供应商。
     *
     * @param id 供应商 ID
     * @return 供应商信息
     */
    @GetMapping("/{id}")
    public Result<ProviderResponse> findById(@PathVariable String id) {
        return Result.success(providerService.findById(id));
    }

    /**
     * 更新供应商。
     *
     * @param id  供应商 ID
     * @param req 更新请求
     * @return 更新后的供应商
     */
    @PutMapping("/{id}")
    public Result<ProviderResponse> update(@PathVariable String id,
                                           @Valid @RequestBody UpdateProviderRequest req) {
        return Result.success(providerService.update(id, req));
    }

    /**
     * 删除供应商。
     *
     * @param id 供应商 ID
     * @return 空结果
     */
    @DeleteMapping("/{id}")
    public Result<Void> delete(@PathVariable String id) {
        providerService.delete(id);
        return Result.success(null);
    }

    /**
     * 切换供应商启用状态。
     *
     * @param id 供应商 ID
     * @return 切换后的供应商
     */
    @PatchMapping("/{id}/toggle")
    public Result<ProviderResponse> toggle(@PathVariable String id) {
        return Result.success(providerService.toggle(id));
    }
}
