package com.ruoyi.system.service.impl;

import java.time.LocalDate;
import java.util.Date;
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.ruoyi.system.mapper.CommissionRatesMapper;
import com.ruoyi.system.domain.CommissionRates;
import com.ruoyi.system.service.ICommissionRatesService;
import com.ruoyi.common.utils.StringUtils;

/**
 * 抽成分成Service业务层处理
 *
 * @author ruoyi
 * @date 2025-12-18
 */
@Service
public class CommissionRatesServiceImpl extends ServiceImpl<BaseMapper<CommissionRates>,CommissionRates> implements ICommissionRatesService
{
    @Autowired
    private CommissionRatesMapper commissionRatesMapper;

    /**
     * 查询抽成分成
     *
     * @param id 抽成分成主键
     * @return 抽成分成
     */
    @Override
    public CommissionRates selectCommissionRatesById(Long id)
    {
        return commissionRatesMapper.selectCommissionRatesById(id);
    }

    /**
     * 查询抽成分成列表
     *
     * @param commissionRates 抽成分成
     * @return 抽成分成
     */
    @Override
    public List<CommissionRates> selectCommissionRatesList(CommissionRates commissionRates)
    {
        return commissionRatesMapper.selectCommissionRatesList(commissionRates);
    }

    /**
     * 新增抽成分成
     *
     * @param commissionRates 抽成分成
     * @return 结果
     */
    @Override
    public int insertCommissionRates(CommissionRates commissionRates)
    {
        return commissionRatesMapper.insertCommissionRates(commissionRates);
    }

    /**
     * 修改抽成分成
     *
     * @param commissionRates 抽成分成
     * @return 结果
     */
    @Override
    public int updateCommissionRates(CommissionRates commissionRates)
    {
        return commissionRatesMapper.updateCommissionRates(commissionRates);
    }

    /**
     * 批量删除抽成分成
     *
     * @param ids 需要删除的抽成分成主键
     * @return 结果
     */
    @Override
    public int deleteCommissionRatesByIds(Long[] ids)
    {
        return commissionRatesMapper.deleteCommissionRatesByIds(ids);
    }

    /**
     * 删除抽成分成信息
     *
     * @param id 抽成分成主键
     * @return 结果
     */
    @Override
    public int deleteCommissionRatesById(Long id)
    {
        return commissionRatesMapper.deleteCommissionRatesById(id);
    }

    /**
     * 获取商家分成比例
     * 在数据库层面查询第一条当前日期在有效期内（startDate <= 当前日期 <= endDate）的记录
     *
     * @param defaultRate 默认分成比例
     * @param shUserId 商家用户ID
     * @return 分成比例
     */
    @Override
    public Double getShCommissionRate(Double defaultRate, Long shUserId)
    {
        // 获取当前日期（只比较日期部分，忽略时间）
        // 将 LocalDate 转换为 Date，设置为当天的 00:00:00
        LocalDate localDate = LocalDate.now();
        Date currentDate = Date.from(localDate.atStartOfDay()
                .atZone(java.time.ZoneId.systemDefault())
                .toInstant());

        // 在数据库层面直接过滤：startDate <= 当前日期 且 endDate >= 当前日期
        // 使用 LIMIT 1 只查询第一条记录，提高性能
        CommissionRates matchedRate = this.getOne(
                new LambdaQueryWrapper<CommissionRates>()
                        .eq(CommissionRates::getUserId, shUserId)
                        .eq(CommissionRates::getDeleted,false)
                        .le(CommissionRates::getStartDate, currentDate)  // startDate <= 当前日期
                        .ge(CommissionRates::getEndDate, currentDate)     // endDate >= 当前日期
                        .last("LIMIT 1"),
                false);  // false 表示如果查询到多条记录不抛异常，只返回第一条

        // 如果找到匹配的记录，解析并返回 rate
        if (matchedRate != null && StringUtils.isNotEmpty(matchedRate.getRate())) {
            try {
                return Double.parseDouble(matchedRate.getRate());
            } catch (NumberFormatException e) {
                // 解析失败，返回默认值
                return defaultRate;
            }
        }

        return defaultRate;
    }
}
