package cn.sikey.hmd.dal.mysql;

import cn.sikey.hmd.dal.dataobject.DeviceQrcodeDO;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.apache.ibatis.annotations.Mapper;

import java.util.Date;

/**
 * 设备二维码
 *
 * @author qin
 */
@Mapper
public interface DeviceQrcodeMapper extends BaseMapper<DeviceQrcodeDO> {

    /*default int resetIfNeeded(String deviceId) {
        UpdateWrapper<DeviceQrcodeDO> updateWrapper = new UpdateWrapper<>();
        updateWrapper.setSql(
                        "remaining_times = CASE " +
                                "WHEN (expire_time IS NULL OR DATE(expire_time) <= CURDATE()) THEN " + // 过期或空值
                                "CASE " +
                                "WHEN DATE(update_time) < CURDATE() THEN 5 " + // 跨天重置为5
                                "ELSE remaining_times " + // 未跨天保持原值
                                "END " +
                                "ELSE remaining_times " + // 未过期保持原值
                                "END, " +
                                "update_time = NOW()"
                )
                .eq("device_id", deviceId)
                // 仅更新过期/空值且跨天的记录
                .apply("(expire_time IS NULL OR DATE(expire_time) <= CURDATE())")
                .apply("DATE(update_time) < CURDATE()");

        return update(updateWrapper);
    }*/

    default DeviceQrcodeDO queryByDeviceId(String deviceId) {
        // 查询最新剩余次数
        QueryWrapper<DeviceQrcodeDO> queryWrapper = new QueryWrapper<>();
        queryWrapper.eq("device_id", deviceId);
        return selectOne(queryWrapper);
    }

    /*default boolean updateRemainingTimes(UpdateRemainingTimesReqVO updateRemainingTimesReqVO) {
        UpdateWrapper<DeviceQrcodeDO> updateWrapper = new UpdateWrapper<>();
        updateWrapper.setSql(
                        "remaining_times = CASE " +
                                "  WHEN DATE(update_time) < CURDATE() THEN 5 " +                // 跨天重置为5次（每日初始化）
                                "  WHEN expire_time IS NOT NULL AND DATE(expire_time) > CURDATE() THEN remaining_times " +  // 未过期不扣减
                                "  ELSE GREATEST(remaining_times - 1, 0) " +                     // 其他情况扣减，最小为0
                                "END, " +
                                "update_time = NOW()"                                            // 更新时间置为当前
                )
                .eq("device_id", updateRemainingTimesReqVO.getDeviceId())
                .and(w -> w
                        .ge("update_time", Instant.now().minus(24, ChronoUnit.HOURS))     // 当天或跨天
                        .or()
                        .isNull("expire_time")                                           // 或expire_time为空
                );
        return update(null, updateWrapper) > 0;

    }*/

    default void updateRemainingTimesExpireTime(String deviceId, String expireTime,int remainingTimes,int plansValidity) {
        UpdateWrapper<DeviceQrcodeDO> updateWrapper = new UpdateWrapper<>();
        updateWrapper.eq("device_id", deviceId);
        updateWrapper.set("expire_time", expireTime);
        updateWrapper.set("remaining_times", remainingTimes);
        updateWrapper.set("plans_validity", plansValidity);
        updateWrapper.set("update_time", new Date());
        update(updateWrapper);
    }

    /*default void updateRemainingTimesExpireTime(String deviceId, Integer extend) {
        UpdateWrapper<DeviceQrcodeDO> updateWrapper = new UpdateWrapper<>();
        updateWrapper.eq("device_id", deviceId)
                .setSql(
                        // 使用 COALESCE 处理空值：如果 expire_time 为空，则用 NOW() 作为基准时间
                        "expire_time = DATE_ADD(COALESCE(expire_time, NOW()), INTERVAL {0} YEAR)",
                        extend  // 参数安全注入（避免 SQL 注入）
                );
        update(updateWrapper);
    }*/

    /*default void updateDeviceQrcode(UpdateDeviceQrcodeReqVO updateDeviceQrcodeReqVO) {
        UpdateWrapper<DeviceQrcodeDO> updateWrapper = new UpdateWrapper<>();
        updateWrapper.eq("device_id", updateDeviceQrcodeReqVO.getDeviceId());
        updateWrapper.set("plans_validity", updateDeviceQrcodeReqVO.getPlansValidity());
        updateWrapper.set("update_time", new Date());
        update(updateWrapper);
    }*/
}
