package com.ktg.iscs.service.impl;

import cn.hutool.core.convert.Convert;
import cn.hutool.core.lang.Assert;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.ktg.common.utils.StringUtils;
import com.ktg.iscs.domain.IsIsolationPoint;
import com.ktg.iscs.domain.IsRfidToken;
import com.ktg.iscs.mapper.IsRfidTokenMapper;
import com.ktg.iscs.service.IIsIsolationPointService;
import com.ktg.iscs.service.IIsRfidTokenService;
import com.ktg.system.strategy.AutoCodeUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.Arrays;
import java.util.List;

/**
 * rfid标识Service业务层处理
 *
 * @author cgj
 * @date 2025-05-14
 */
@Service
public class IsRfidTokenServiceImpl extends ServiceImpl<IsRfidTokenMapper, IsRfidToken> implements IIsRfidTokenService {

    @Autowired
    private IsRfidTokenMapper isRfidTokenMapper;
    @Autowired
    private IIsIsolationPointService iIsIsolationPointService;
    @Autowired
    private AutoCodeUtil autoCodeUtil;

    @Override
    public Page<IsRfidToken> getIsRfidTokenPage(Page<IsRfidToken> page, IsRfidToken isRfidToken) {
        Page<IsRfidToken> result = page(page, Wrappers.<IsRfidToken>lambdaQuery()
                .like(StringUtils.isNotBlank(isRfidToken.getRfidCode()), IsRfidToken::getRfidCode, isRfidToken.getRfidCode())
                .like(StringUtils.isNotBlank(isRfidToken.getRfid()), IsRfidToken::getRfid, isRfidToken.getRfid())
                .eq(StringUtils.isNotBlank(isRfidToken.getRfidType()), IsRfidToken::getRfidType, isRfidToken.getRfidType())
                .eq(StringUtils.isNotBlank(isRfidToken.getStatus()), IsRfidToken::getStatus, isRfidToken.getStatus())
                .orderByDesc(IsRfidToken::getRfidId));
        return result;
    }

    @Override
    public Boolean insertIsRfidToken(IsRfidToken isRfidToken) {
        // 检查编码重复
        if (StringUtils.isNotBlank(isRfidToken.getRfidCode())) {
            List<IsRfidToken> list = list(Wrappers.<IsRfidToken>lambdaQuery()
                    .eq(IsRfidToken::getRfidCode, isRfidToken.getRfidCode()));
            Assert.isTrue(list.isEmpty(), "该编码已被使用！");
        }
        // 检查rfid重复
        List<IsRfidToken> list1 = list(Wrappers.<IsRfidToken>lambdaQuery()
                .eq(IsRfidToken::getRfid, isRfidToken.getRfid()));
        Assert.isTrue(list1.isEmpty(), "该RFID已存在！");
        return save(isRfidToken);
    }

    @Override
    public Boolean updateIsRfidToken(IsRfidToken isRfidToken) {
        Assert.notNull(isRfidToken.getRfidId(), "主键ID不可为空！");
        // 检查编码重复
        if (StringUtils.isNotBlank(isRfidToken.getRfidCode())) {
            List<IsRfidToken> list = list(Wrappers.<IsRfidToken>lambdaQuery()
                    .eq(IsRfidToken::getRfidCode, isRfidToken.getRfidCode())
                    .ne(IsRfidToken::getRfidId, isRfidToken.getRfidId()));
            Assert.isTrue(list.isEmpty(), "该编码已被使用！");
        }
        // 检查rfid重复
        List<IsRfidToken> list1 = list(Wrappers.<IsRfidToken>lambdaQuery()
                .eq(IsRfidToken::getRfid, isRfidToken.getRfid())
                .ne(IsRfidToken::getRfidId, isRfidToken.getRfidId()));
        Assert.isTrue(list1.isEmpty(), "该RFID已存在！");
        return updateById(isRfidToken);
    }

    @Override
    public Boolean deleteIsRfidTokenByRfidIds(String rfidIds) {
        cn.hutool.core.lang.Assert.notBlank(rfidIds, "请选择需要删除的数据!");
        Long[] longIds = Convert.toLongArray(rfidIds);
        // 查询有没有正在使用的点位，如果有则不能删除
        List<IsIsolationPoint> list = iIsIsolationPointService.list(Wrappers.<IsIsolationPoint>lambdaQuery()
                .in(IsIsolationPoint::getRfidId, longIds));
        Assert.isTrue(list.isEmpty(), "存在正在被隔离点使用的RFID，不可删除！");
        return removeBatchByIds(Arrays.asList(longIds));
    }

    @Override
    public Boolean insertIsRfidTokenByCabinet(IsRfidToken isRfidToken) {
        Assert.isFalse(StringUtils.isBlank(isRfidToken.getRfid()), "请给我RFID！");
        // 检查rfid重复
        List<IsRfidToken> list1 = list(Wrappers.<IsRfidToken>lambdaQuery()
                .eq(IsRfidToken::getRfid, isRfidToken.getRfid()));
        Assert.isTrue(list1.isEmpty(), "该RFID已存在！");
        // 2.自动生成编码
        String rfidCode = autoCodeUtil.genSerialCode("RFID_CODE", null);
        isRfidToken.setRfidCode(rfidCode);
        isRfidToken.setRfidType("0");
        return save(isRfidToken);
    }

}
