package com.yfd.platform.modules.auxcontrol.service.impl;

import cn.hutool.core.lang.Validator;
import cn.hutool.core.util.StrUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.yfd.platform.modules.auxcontrol.domain.GatewayDevice;
import com.yfd.platform.modules.auxcontrol.domain.MeterDevice;
import com.yfd.platform.modules.auxcontrol.mapper.MeterDeviceMapper;
import com.yfd.platform.modules.auxcontrol.service.IMeterDeviceService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.yfd.platform.utils.SecurityUtils;
import org.springframework.stereotype.Service;

import java.sql.Timestamp;
import java.util.Date;
import java.util.List;
import java.util.Map;

/**
 * <p>
 * 变电站二次设备中的智能仪表监控设备 服务实现类
 * </p>
 *
 * @author zhengsl
 * @since 2025-04-23
 */
@Service
public class MeterDeviceServiceImpl extends ServiceImpl<MeterDeviceMapper, MeterDevice> implements IMeterDeviceService {

    /**********************************
     * 用途说明: 分页查询变电站辅控设备
     * 参数说明 deviceName 设备名称
     * 参数说明 deviceModel设备型号
     * 参数说明 deviceType设备类型
     * 参数说明 status 状态
     * 参数说明 systemcode 系统编码
     * 参数说明 page
     * 返回值说明: com.baomidou.mybatisplus.extension.plugins.pagination.Page<com.yfd.platform.modules.auxcontrol.domain.MeterDevice>
     ***********************************/
    @Override
    public Page<MeterDevice> getDevicePage(String stationId,String deviceName, String deviceModel, String deviceType, String status,
                                           String systemcode, Page<MeterDevice> page) {
        LambdaQueryWrapper<MeterDevice> queryWrapper = new LambdaQueryWrapper<>();
        queryWrapper.eq(StrUtil.isNotBlank(stationId), MeterDevice::getStationId, stationId);
        queryWrapper.like(StrUtil.isNotBlank(deviceName), MeterDevice::getDeviceName, deviceName);
        queryWrapper.like(StrUtil.isNotBlank(deviceModel), MeterDevice::getDeviceModel, deviceModel);
        queryWrapper.eq(StrUtil.isNotBlank(deviceType), MeterDevice::getDeviceType, deviceType);
        queryWrapper.eq(StrUtil.isNotBlank(systemcode), MeterDevice::getSystemcode, systemcode).orderByAsc(MeterDevice::getDeviceCode);
        return this.page(page, queryWrapper);
    }

    /**********************************
     * 用途说明: 新增变电站辅控设备信息
     * 参数说明 meterDevice 辅控设备信息
     * 返回值说明: boolean
     ***********************************/
    @Override
    public boolean addMeterDevice(MeterDevice meterDevice) {
        if (StrUtil.isNotBlank(meterDevice.getIpAddr())) {
            LambdaQueryWrapper<MeterDevice> queryWrapper = new LambdaQueryWrapper<>();
            queryWrapper.eq(MeterDevice::getIpAddr, meterDevice.getIpAddr());
            int count = this.count(queryWrapper);
            if (count > 0) {
                throw new RuntimeException("当前ip已经有设备绑定");
            }
        }
        if (StrUtil.isNotBlank(meterDevice.getIpAddr()) && !Validator.isIpv4(meterDevice.getIpAddr())) {
            throw new RuntimeException("当前ip地址不规范");
        }
        meterDevice.setLastmodifier(SecurityUtils.getCurrentUsername());
        //当前操作时间 最近修改时间
        meterDevice.setLastmodifydate(new Timestamp(System.currentTimeMillis()));
        return this.saveOrUpdate(meterDevice);
    }

    /**********************************
     * 用途说明: 修改变电站辅控设备信息
     * 参数说明 meterDevice 辅控设备信息
     * 返回值说明: boolean
     ***********************************/
    @Override
    public boolean updateMeterDevice(MeterDevice meterDevice) {
        if (StrUtil.isNotBlank(meterDevice.getIpAddr())) {
            LambdaQueryWrapper<MeterDevice> queryWrapper = new LambdaQueryWrapper<>();
            queryWrapper.ne(MeterDevice::getDeviceId, meterDevice.getDeviceId()).eq(MeterDevice::getIpAddr,
                    meterDevice.getIpAddr());
            int count = this.count(queryWrapper);
            if (count > 0) {
                throw new RuntimeException("当前ip已经有设备绑定");
            }
        }
        if (StrUtil.isNotBlank(meterDevice.getIpAddr()) && !Validator.isIpv4(meterDevice.getIpAddr())) {
            throw new RuntimeException("当前ip地址不规范");
        }
        meterDevice.setLastmodifier(SecurityUtils.getCurrentUsername());
        //当前操作时间 最近修改时间
        meterDevice.setLastmodifydate(new Timestamp(System.currentTimeMillis()));
        return this.saveOrUpdate(meterDevice);
    }

    /**********************************
     * 用途说明: 批量修改变电站辅控设备信息
     * 参数说明 ids 设备id集合
     * 参数说明 ip 设备ip
     * 返回值说明: boolean
     ***********************************/
    @Override
    public boolean batchUpdateDeviceIp(List<String> ids, String ip) {
        if (StrUtil.isNotBlank(ip) && !Validator.isIpv4(ip)) {
            throw new RuntimeException("当前ip地址不规范");
        }
        LambdaUpdateWrapper<MeterDevice> updateWrapper = new LambdaUpdateWrapper<>();
        updateWrapper.in(MeterDevice::getDeviceId, ids).set(MeterDevice::getNetdeviceIp, ip);
        return this.update(updateWrapper);
    }

    /**********************************
     * 用途说明: 根据系统编号查询设备
     * 参数说明 stationId 变电站Id
     * 参数说明 systemCode 系统编号
     * 返回值说明: java.util.List<java.util.Map<java.lang.String,java.lang.Object>>
     ***********************************/
    @Override
    public List<Map<String, Object>> getMeterDeviceByCode(String stationId, String systemCode) {
        LambdaQueryWrapper<MeterDevice> queryWrapper = new LambdaQueryWrapper<>();
        queryWrapper.eq(StrUtil.isNotBlank(stationId), MeterDevice::getStationId, stationId).eq(StrUtil.isNotBlank(systemCode), MeterDevice::getSystemcode, systemCode).select(MeterDevice::getDeviceId, MeterDevice::getDeviceName).orderByAsc(MeterDevice::getDeviceCode);
        return this.listMaps(queryWrapper);
    }
}
