package com.aucma.report.service.impl;

import com.aucma.report.domain.vo.*;
import com.aucma.report.mapper.Board4Mapper;
import com.aucma.report.service.IBoard4Service;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;

/**
 * Board4看板数据Service业务层处理
 * 数字化注塑车间管控中心
 *
 * @author YinQ
 */
@Service
public class Board4ServiceImpl implements IBoard4Service {

    @Autowired
    private Board4Mapper board4Mapper;

    /**
     * 获取产量统计（年累计、月累计、日累计）
     * 年累计取“上一自然年”工单完成量汇总（上一年1月1日到12月31日，非滚动12个月），
     * 月累计取“本自然月”工单完成量汇总（本月1日至月末），
     * 日累计取“当天”每台设备最新“机台状态-实际产出数量”的汇总（当天00:00-23:59）
     */
    @Override
    public Board4ProductionTotalVo getProductionTotal() {
        // 初始化返回对象，避免前端空指针
        Board4ProductionTotalVo vo = new Board4ProductionTotalVo();
        // 年累计：去年完成数量总和
        Long yearTotal = board4Mapper.selectYearProductionTotal();
        // 月累计：当月完成数量总和
        Long monthTotal = board4Mapper.selectMonthProductionTotal();
        // 日累计：当天每台设备最新产出数量汇总
        Long dayTotal = board4Mapper.selectDayProductionTotal();
        // 空值保护并赋值
        vo.setYearTotal(yearTotal != null ? yearTotal : 0L);
        vo.setMonthTotal(monthTotal != null ? monthTotal : 0L);
        vo.setDayTotal(dayTotal != null ? dayTotal : 0L);
        return vo;
    }

    /**
     * 获取今日工单统计（计划数、完成数、差异数、完成率）
     * 差异数=计划数-完成数，完成率为百分比数值字符串，不包含“%”
     */
    @Override
    public Board4OrderStatisticsVo getOrderStatistics() {
        // 初始化返回对象
        Board4OrderStatisticsVo vo = new Board4OrderStatisticsVo();
        // 查询今日工单统计（计划/完成）
        HashMap<String, Object> stats = board4Mapper.selectTodayOrderStatistics();
        if (stats != null) {
            // 安全转换计划数与完成数
            Long planCount = getLongValue(stats.get("PLAN_COUNT"));
            Long completeCount = getLongValue(stats.get("COMPLETE_COUNT"));
            // 设置基础字段
            vo.setPlanCount(planCount);
            vo.setCompleteCount(completeCount);
            // 差异=计划-完成
            vo.setDiffCount(planCount - completeCount);
            // 完成率=完成/计划（四舍五入），返回不带“%”
            if (planCount > 0) {
                vo.setCompleteRate(String.valueOf(Math.round(completeCount * 100.0 / planCount)));
            } else {
                vo.setCompleteRate("0");
            }
        } else {
            // 无数据时返回0，保证前端稳定
            vo.setPlanCount(0L);
            vo.setCompleteCount(0L);
            vo.setDiffCount(0L);
            vo.setCompleteRate("0");
        }
        return vo;
    }

    /**
     * 获取今日工单进度列表
     * 进度为百分比字符串，包含“%”
     */
    @Override
    public List<Board4OrderProgressVo> getOrderProgressList() {
        // 查询今日工单列表并计算进度
        List<Board4OrderProgressVo> list = board4Mapper.selectTodayOrderProgressList();
        return list != null ? list : new ArrayList<>();
    }

    /**
     * 获取设备状态统计
     * 设备状态来自台账表，按DEVICE_STATUS统计；维修次数来自故障实例表
     */
    @Override
    public Board4DeviceStatusVo getDeviceStatus() {
        // 初始化返回对象
        Board4DeviceStatusVo vo = new Board4DeviceStatusVo();
        // 查询设备状态分布
        HashMap<String, Object> stats = board4Mapper.selectDeviceStatusStatistics();
        if (stats != null) {
            // 正常/告警/停机/总数
            vo.setNormalCount(getLongValue(stats.get("NORMAL_COUNT")));
            vo.setAlarmCount(getLongValue(stats.get("ALARM_COUNT")));
            vo.setStopCount(getLongValue(stats.get("STOP_COUNT")));
            vo.setTotalCount(getLongValue(stats.get("TOTAL_COUNT")));
        } else {
            // 无数据时默认0
            vo.setNormalCount(0L);
            vo.setAlarmCount(0L);
            vo.setStopCount(0L);
            vo.setTotalCount(0L);
        }
        // 总维修次数统计
        Long repairCount = board4Mapper.selectTotalRepairCount();
        vo.setRepairCount(repairCount != null ? repairCount : 0L);
        return vo;
    }

    /**
     * 获取最新报警信息
     * 取报警表最新一条记录，时间格式为HH24:MI:SS
     */
    @Override
    public Board4AlarmInfoVo getAlarmInfo() {
        // 初始化返回对象
        Board4AlarmInfoVo vo = new Board4AlarmInfoVo();
        // 查询最新报警记录
        HashMap<String, Object> info = board4Mapper.selectLatestAlarmInfo();
        if (info != null && !info.isEmpty()) {
            // 有报警：填充设备、原因、时间
            vo.setHasAlarm(true);
            vo.setDeviceName(getStringValue(info.get("DEVICE_NAME")));
            vo.setAlarmReason(getStringValue(info.get("ALARM_REASON")));
            vo.setAlarmTime(getStringValue(info.get("ALARM_TIME")));
        } else {
            // 无报警：hasAlarm=false，其余置空
            vo.setHasAlarm(false);
            vo.setDeviceName("");
            vo.setAlarmReason("");
            vo.setAlarmTime("");
        }
        return vo;
    }

    /**
     * 获取维修分析列表（按设备聚合）
     * 统计每台设备故障次数并计算占比，结果按次数降序取TOP10
     */
    @Override
    public List<Board4RepairAnalysisVo> getRepairAnalysisList() {
        // 查询维修分析TOP10
        List<Board4RepairAnalysisVo> list = board4Mapper.selectRepairAnalysisByDevice();
        return list != null ? list : new ArrayList<>();
    }

    /**
     * 获取报修趋势列表
     * 按小时统计当天报修次数（当天00:00-23:59）
     */
    @Override
    public List<Board4RepairTrendVo> getRepairTrendList() {
        // 查询当天小时维度的报修数量
        List<Board4RepairTrendVo> list = board4Mapper.selectRepairTrendList();
        return list != null ? list : new ArrayList<>();
    }

    /**
     * 获取质量统计
     * TREATMENT_MEASURE=3为合格，=1为返修
     */
    @Override
    public Board4QualityStatisticsVo getQualityStatistics() {
        // 初始化返回对象
        Board4QualityStatisticsVo vo = new Board4QualityStatisticsVo();
        // 查询当天质量统计
        HashMap<String, Object> stats = board4Mapper.selectQualityStatistics();
        if (stats != null) {
            // 合格/不合格数
            vo.setQualifiedCount(getLongValue(stats.get("QUALIFIED_COUNT")));
            vo.setUnqualifiedCount(getLongValue(stats.get("UNQUALIFIED_COUNT")));
        } else {
            // 无数据默认0
            vo.setQualifiedCount(0L);
            vo.setUnqualifiedCount(0L);
        }
        return vo;
    }

    /**
     * 获取质量追溯列表
     * 近7天按产品统计合格率（包含当天），按合格率降序取TOP10
     */
    @Override
    public List<Board4QualityTraceVo> getQualityTraceList() {
        // 查询近7天质量追溯TOP10
        List<Board4QualityTraceVo> list = board4Mapper.selectQualityTraceList();
        return list != null ? list : new ArrayList<>();
    }

    /**
     * 获取设备分析/产量列表
     * 仅统计有效生产设备，取当天每台设备最新实际产出数量
     */
    @Override
    public List<Board4DeviceProductionVo> getDeviceProductionList() {
        // 查询当天设备产量列表
        List<Board4DeviceProductionVo> list = board4Mapper.selectDeviceProductionAnalysis();
        return list != null ? list : new ArrayList<>();
    }

    /**
     * 安全获取Long值
     */
    private Long getLongValue(Object obj) {
        // 空值保护
        if (obj == null) {
            return 0L;
        }
        // 数值类型直接转换
        if (obj instanceof Number) {
            return ((Number) obj).longValue();
        }
        // 字符串安全解析
        try {
            return Long.parseLong(obj.toString());
        } catch (NumberFormatException e) {
            return 0L;
        }
    }

    /**
     * 安全获取String值
     */
    private String getStringValue(Object obj) {
        // 空值返回空字符串
        if (obj == null) {
            return "";
        }
        return obj.toString();
    }
}
