package org.dromara.rfid.controller;

import lombok.RequiredArgsConstructor;
import org.dromara.common.core.domain.R;
import org.dromara.common.web.core.BaseController;
import org.dromara.rfid.domain.vo.DashboardVO;
import org.dromara.rfid.service.IDashboardService;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

import java.util.List;

/**
 * RFID 监控看板接口
 * <p>
 * 提供前端看板定时刷新所需的数据接口，分为三个独立接口：
 * <ul>
 *     <li>实时统计接口（按秒刷新）：顶部统计 + 告警列表</li>
 *     <li>设备状态接口（定时刷新）：设备树 + 设备最新读取记录</li>
 *     <li>成功率趋势接口（按小时统计）：成功率折线图</li>
 * </ul>
 * </p>
 *
 * @author zch
 * @date 2025-11-26
 */
@RequiredArgsConstructor
@RestController
@RequestMapping("/rfid/dashboard")
public class DashboardController extends BaseController {

    private final IDashboardService dashboardService;

    /**
     * 【接口1】实时统计数据（按秒刷新）
     * <p>
     * 包含：顶部统计（设备数量、在线数量、离线数量、告警数量）+ 告警统计列表
     * </p>
     * <p>
     * 当前实现：告警列表默认不限制数量，返回全部告警记录，供前端滚动显示。
     * </p>
     *
     * @param alarmLimit 告警列表限制数量（可选，不传则不限制）
     * @return 实时统计数据
     */
    @GetMapping("/realtime")
    public R<DashboardVO.RealtimeStats> getRealtimeStats(
        @RequestParam(required = false) Integer alarmLimit) {
        return R.ok(dashboardService.getRealtimeStats(alarmLimit));
    }

    /**
     * 【接口2】位置树（含设备信息）
     * <p>
     * 返回完整的位置树结构，用于前端构建设备树并滚动显示。
     * </p>
     * <p>
     * 当前实现：
     * <ul>
     *     <li>返回所有位置的树形结构；</li>
     *     <li>位置类型为 3（工位）时表示设备节点，包含设备ID、编号、名称、在线状态、告警状态；</li>
     *     <li>不返回设备的读取记录数据，具体记录由 C# WebSocket 实时推送给前端；</li>
     *     <li>前端通过 deviceId 匹配 WebSocket 数据。</li>
     * </ul>
     * </p>
     *
     * @return 位置树列表（顶级节点列表）
     */
    @GetMapping("/deviceStatus")
    public R<List<DashboardVO.LocationTreeNode>> getLocationTree() {
        return R.ok(dashboardService.getLocationTree());
    }

    /**
     * 【接口3】成功率趋势（按小时统计）
     * <p>
     * 按小时统计读取成功率，用于折线图展示，不需要频繁刷新。
     * 当前实现：
     * <ul>
     *     <li>前端无需传任何查询参数；</li>
     *     <li>后端默认以当前日期统计“今日”0-23 点成功率；</li>
     *     <li>同时附带“昨日同一小时”的成功率，用于前端对比展示。</li>
     * </ul>
     * </p>
     *
     * @param type 预留参数，当前实现忽略，前端可不传
     * @return 成功率趋势数据（固定 24 条，按小时排序）
     */
    @GetMapping("/successRate")
    public R<List<DashboardVO.SuccessRateTrend>> getSuccessRateTrends(
        @RequestParam(required = false, defaultValue = "today") String type) {
        return R.ok(dashboardService.getSuccessRateTrends(type));
    }

    // ==================== 以下为原有接口（保留） ====================

    /**
     * 获取完整看板数据
     *
     * @param locationId 位置ID（可选）
     * @return 完整看板数据
     */
    @GetMapping("/data")
    public R<DashboardVO> getDashboardData(
        @RequestParam(required = false) Long locationId) {
        return R.ok(dashboardService.getDashboardData(locationId));
    }

    /**
     * 获取统计概览
     *
     * @return 统计概览数据
     */
    @GetMapping("/overview")
    public R<DashboardVO.StatisticsOverview> getOverview() {
        return R.ok(dashboardService.getOverview());
    }

    /**
     * 获取告警统计列表
     *
     * @param limit 限制数量（默认10条）
     * @return 告警统计列表
     */
    @GetMapping("/alarmStats")
    public R<List<DashboardVO.AlarmStatVO>> getAlarmStats(
        @RequestParam(required = false, defaultValue = "10") Integer limit) {
        return R.ok(dashboardService.getAlarmStats(limit));
    }
}
