package com.pm.device.service.impl;

import java.util.List;
import java.util.Map;
import java.util.HashMap;
import java.util.ArrayList;
import com.pm.common.utils.DateUtils;
import com.pm.common.utils.SecurityUtils;
import com.pm.common.utils.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.pm.device.mapper.IbmsDeviceAlarmsMapper;
import com.pm.device.service.IIbmsDeviceAlarmsService;
import com.pm.common.config.PageData;

/**
 * 设备告警Service业务层处理
 *
 * @author system
 * @date 2025-01-06
 */
@Service
public class IbmsDeviceAlarmsServiceImpl implements IIbmsDeviceAlarmsService
{
    @Autowired
    private IbmsDeviceAlarmsMapper ibmsDeviceAlarmMapper;

    /**
     * 查询设备告警
     *
     * @param id 设备告警主键
     * @return 设备告警
     */
    @Override
    public PageData selectIbmsDeviceAlarmById(Long id)
    {
        return ibmsDeviceAlarmMapper.selectIbmsDeviceAlarmById(id);
    }

    /**
     * 查询设备告警列表
     *
     * @param pd
     * @return 设备告警
     */
    @Override
    public List<PageData> selectIbmsDeviceAlarmList(PageData pd)
    {
        return ibmsDeviceAlarmMapper.selectIbmsDeviceAlarmList(pd);
    }

    /**
     * 查询告警统计信息
     *
     * @param pd
     * @return 统计信息
     */
    @Override
    public PageData selectAlarmStatistics(PageData pd)
    {
        return ibmsDeviceAlarmMapper.selectAlarmStatistics(pd);
    }

    /**
     * 新增设备告警
     *
     * @param pd
     * @return 结果
     */
    @Override
    public int insertIbmsDeviceAlarm(PageData pd)
    {
        // 生成告警编码
        if (StringUtils.isEmpty(pd.getString("alarmCode"))) {
            pd.put("alarmCode", generateAlarmCode());
        }
        pd.put("createTime", DateUtils.getTime());
        pd.put("updateTime", DateUtils.getTime());
        return ibmsDeviceAlarmMapper.insertIbmsDeviceAlarm(pd);
    }

    /**
     * 修改设备告警
     *
     * @param pd
     * @return 结果
     */
    @Override
    public int updateIbmsDeviceAlarm(PageData pd)
    {
        pd.put("updateTime", DateUtils.getTime());
        return ibmsDeviceAlarmMapper.updateIbmsDeviceAlarm(pd);
    }

    /**
     * 复位告警
     *
     * @param pd
     * @return 结果
     */
    @Override
    public int resetAlarm(PageData pd)
    {
        pd.put("resetTime", DateUtils.getTime());
        pd.put("resetBy", SecurityUtils.getUsername());
        pd.put("updateTime", DateUtils.getTime());
        Integer id=(Integer)  pd.get("id");
        // 记录操作日志
        recordAlarmLog(id, "手动复位告警", SecurityUtils.getUsername());
        
        return ibmsDeviceAlarmMapper.resetAlarm(pd);
    }

    /**
     * 创建服务单
     *
     * @param pd
     * @return 结果
     */
    @Override
    public Map<String, Object> createServiceOrder(PageData pd)
    {
        Map<String, Object> result = new HashMap<>();
        
        try {
            // 生成服务单号
            String serviceOrderNo = generateServiceOrderNo();
            Integer alarmId=(Integer) pd.get("alarmId");
            // 更新告警记录的服务单号
            PageData updatePd = new PageData();
            updatePd.put("id", pd.get("alarmId"));
            updatePd.put("serviceOrderNo", serviceOrderNo);
            updatePd.put("updateTime", DateUtils.getTime());
            ibmsDeviceAlarmMapper.updateServiceOrderNo(updatePd);
            
            // 记录操作日志
            recordAlarmLog(alarmId,
                "创建服务单，单号：" + serviceOrderNo + "，服务类型：" + pd.getString("serviceType"), 
                SecurityUtils.getUsername());
            
            // TODO: 这里应该调用服务单系统的接口创建实际的服务单
            // 模拟调用外部接口
            result.put("success", true);
            result.put("serviceOrderNo", serviceOrderNo);
            result.put("msg", "服务单创建成功");
            
        } catch (Exception e) {
            result.put("success", false);
            result.put("msg", "服务单创建失败：" + e.getMessage());
        }
        
        return result;
    }

    /**
     * 获取告警详情（包含处理记录）
     *
     * @param id
     * @return 告警详情
     */
    @Override
    public Map<String, Object> getAlarmDetail(Long id)
    {
        Map<String, Object> result = new HashMap<>();
        
        // 获取告警基本信息
        PageData alarm = ibmsDeviceAlarmMapper.selectIbmsDeviceAlarmById(id);
        result.put("data", alarm);
        
        // 获取处理记录（模拟数据）
        List<Map<String, Object>> logs = getAlarmLogs(id);
        result.put("logs", logs);
        
        return result;
    }

    /**
     * 批量删除设备告警
     *
     * @param ids 需要删除的设备告警主键
     * @return 结果
     */
    @Override
    public int deleteIbmsDeviceAlarmByIds(Long[] ids)
    {
        return ibmsDeviceAlarmMapper.deleteIbmsDeviceAlarmByIds(ids);
    }

    /**
     * 删除设备告警信息
     *
     * @param id 设备告警主键
     * @return 结果
     */
    @Override
    public int deleteIbmsDeviceAlarmById(Long id)
    {
        return ibmsDeviceAlarmMapper.deleteIbmsDeviceAlarmById(id);
    }

    /**
     * 生成告警编码
     */
    private String generateAlarmCode() {
        String dateStr = DateUtils.dateTimeNow("yyyyMMdd");
        // TODO: 实际应该从数据库获取当天的序号
        String seq = String.format("%04d", (int)(Math.random() * 10000));
        return "ALM" + dateStr + seq;
    }

    /**
     * 生成服务单号
     */
    private String generateServiceOrderNo() {
        String dateStr = DateUtils.dateTimeNow("yyyyMMdd");
        // TODO: 实际应该从数据库获取当天的序号
        String seq = String.format("%04d", (int)(Math.random() * 10000));
        return "SVC" + dateStr + seq;
    }

    /**
     * 记录告警操作日志
     */
    private void recordAlarmLog(Integer alarmId, String content, String operator) {
        // TODO: 实际应该插入到告警日志表中
        // 这里仅作为示例，实际项目中应该有专门的日志表
    }

    /**
     * 获取告警处理记录（模拟数据）
     */
    private List<Map<String, Object>> getAlarmLogs(Long alarmId) {
        List<Map<String, Object>> logs = new ArrayList<>();
        
        // 模拟一些处理记录
        Map<String, Object> log1 = new HashMap<>();
        log1.put("id", 1);
        log1.put("alarmId", alarmId);
        log1.put("content", "系统自动生成告警");
        log1.put("operator", "系统");
        log1.put("createTime", "2025-01-06 08:30:00");
        logs.add(log1);
        
        return logs;
    }
}