package com.zg.project.wisdom.controller;

import com.zg.framework.web.domain.AjaxResult;
import com.zg.project.wisdom.domain.vo.*;
import com.zg.project.wisdom.service.RkStatisticsService;
import com.zg.project.wisdom.service.WarehouseStatService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.web.bind.annotation.*;

import javax.annotation.Resource;
import javax.servlet.http.HttpServletResponse;
import java.util.List;
import java.util.Map;

@Api(tags = "库存统计")
@RestController
@RequestMapping("/stat")
public class RkStatisticsController {

    @Resource
    private RkStatisticsService rkStatisticsService;

    @Resource
    private WarehouseStatService warehouseStatService;


    /** 库龄统计（未出库：>10 / >20 / >30 天），value 为项目数（按 xm_no 去重） */
    @ApiOperation("库龄统计（未出库：>10 / >20 / >30 天）")
    @GetMapping("/age")
    public AjaxResult ageStats() {
        List<Map<String, Object>> stats = rkStatisticsService.getAgeStatsAsList();
        return AjaxResult.success(stats);
    }

    /**
     * 仓库-场景库位使用统计（总仓库数、每仓库场景数、每场景库位/使用率/空闲率）
     * @return
     */
    @GetMapping("/warehouseScene")
    public AjaxResult warehouseScene() {
        WarehouseSceneStatsResp resp = warehouseStatService.getWarehouseSceneStats();
        return AjaxResult.success(resp);
    }

    /**
     * 按仓库查询：场景列表 + 每个场景的可用库位明细
     * 示例：GET /warehouse/positions/available?warehouseCode=CK001
     */
    @ApiOperation("按仓库查询各场景的可用库位（排除未出库占用）")
    @GetMapping("/warehouse/available")
    public AjaxResult listAvailableByWarehouse(@RequestParam String warehouseCode) {
        List<SceneAvailableVO> data = rkStatisticsService.listAvailableByWarehouse(warehouseCode);
        return AjaxResult.success(data);
    }

    /**
     * 当前库存根据入库类型统计项目数，每个项目的条目数，实际入库总数，金额总和（仅未出库）
     */
    @GetMapping("/type/summary")
    public AjaxResult typeSummary() {
        List<RkSummaryVO> list = rkStatisticsService.getTypeSummary();
        return AjaxResult.success(list);
    }


    /**
     * 县局汇总（仅未出库，county 非空）
     */
    @GetMapping("/county/summary")
    public AjaxResult countySummary() {
        List<RkSummaryVO> list = rkStatisticsService.getCountySummary();
        return AjaxResult.success(list);
    }

    /**
     * 一个接口：一周天级统计（返回入库+出库）根据供电中心统计
     * - 如果 start/end 都传了，就用传入值；
     * - 否则：end=今天，start=本周周一；
     */
    @ApiOperation("一周天级统计（入库+出库合并返回）")
    @GetMapping("/week/daily")
    public AjaxResult weekDaily(@RequestParam(required = false) String start,
                                @RequestParam(required = false) String end) {
        Map<String, Object> data = rkStatisticsService.weekDaily(start, end);
        return AjaxResult.success(data);
    }

    /**
     * 库龄统计（>30天 & >60天）：项目数、条目数、总金额 + 明细列表
     */
    @ApiOperation("库龄统计：>30天 & >60天（含汇总与明细）")
    @GetMapping("/age/count")
    public AjaxResult age3060() {
        List<Map<String, Object>> data = rkStatisticsService.getAge3060();
        return AjaxResult.success(data);
    }

    @ApiOperation("导出库龄明细（>30天与>60天，合并导出）")
    @PostMapping("/age/export")
    public void exportAge3060(HttpServletResponse response) {
        rkStatisticsService.exportAge3060(response);
    }

    /**
     * 入库类型饼图数据接口
     * 返回每个入库类型的项目数、条目数、总数量、总金额
     */
    @ApiOperation("入库类型饼图数据")
    @GetMapping("/type/pie")
    public AjaxResult typePie() {
        List<RkTypePieVO> list = rkStatisticsService.getTypePie();
        return AjaxResult.success(list);
    }

    /**
     * 按入库类型统计（带时间范围）
     * 统计维度：项目数、条目数、总数量、总金额
     * 时间字段：rk_time（自然日闭区间 [start, end]）
     * 参数格式：推荐 yyyy-MM-dd（如 2025-01-01）
     */
    @ApiOperation("按入库类型统计（带时间范围：项目数/条目数/总数量/总金额）")
    @GetMapping("/type/range")
    public AjaxResult typeSummaryRange(@RequestParam(required = false) String start,
                                       @RequestParam(required = false) String end) {
        List<RkTypePieVO> list = rkStatisticsService.getTypeSummaryByRange(start, end);
        return AjaxResult.success(list);
    }

    @ApiOperation("按出库类型统计（带时间范围：项目数/条目数/总数量/总金额）")
    @GetMapping("/type/out/range")
    public AjaxResult outTypeSummaryRange(@RequestParam(required = false) String start,
                                          @RequestParam(required = false) String end) {
        List<RkTypePieVO> list = rkStatisticsService.getOutTypeSummaryByRange(start, end);
        return AjaxResult.success(list);
    }


    @ApiOperation("本月出入库汇总（项目数/条目数/总数量/总金额）")
    @GetMapping("/month/summary")
    public AjaxResult monthSummary() {
        RkMonthInOutSummaryVO vo = rkStatisticsService.getThisMonthInOutSummary();
        return AjaxResult.success(vo);
    }

    @ApiOperation("应到未到统计（未到/部分未到）")
    @GetMapping("/undelivered")
    public AjaxResult undelivered() {
        GysJhUndeliveredVO vo = rkStatisticsService.getUndeliveredSummary();
        return AjaxResult.success(vo);
    }

    @ApiOperation("当前库存按物资类型统计（项目数/条目数/总数量/总金额）")
    @GetMapping("/stock/wlType")
    public AjaxResult stockByWlType() {
        List<WlTypeStockStatVO> list = rkStatisticsService.getCurrentStockByWlType();
        return AjaxResult.success(list);
    }

    /**
     * 当前库存：入库时间 >30天（项目数 / 条目数 / 总数量 / 总金额）
     * 口径：仅统计未删除、未出库（is_chuku=0 或 NULL）、rk_time 非空且 DATEDIFF(CURDATE(), DATE(rk_time)) > 30 的记录
     */
    @ApiOperation("当前库存：入库时间>30天（项目数/条目数/总数量/总金额）")
    @GetMapping("/age/gt30")
    public AjaxResult ageGt30() {
        RkTypePieVO vo = rkStatisticsService.getAgeGt30Summary();
        return AjaxResult.success(vo);
    }

    /**
     * range: 0=最近一周(7天, 按日)；2=最近半年(6个月, 按月)
     * 返回：每个时间桶一行（bucket, 入/出库项目数&条目数）
     */
    @ApiOperation("出/入库项目数与条目数（按时间桶返回）")
    @GetMapping("/io/buckets")
    public AjaxResult ioBuckets(@RequestParam Integer range) {
        List<IOBucketVO> rows = rkStatisticsService.getIOBuckets(range);
        return AjaxResult.success(rows);
    }
}