package com.yhy.module.core.service.quota;

import com.yhy.module.core.controller.admin.quota.vo.QuotaRateItemRespVO;
import com.yhy.module.core.controller.admin.quota.vo.QuotaRateItemSaveReqVO;
import com.yhy.module.core.controller.admin.quota.vo.QuotaRateModeNodeSaveReqVO;
import com.yhy.module.core.controller.admin.quota.vo.QuotaRateValueRulesReqVO;
import com.yhy.module.core.dal.dataobject.quota.QuotaRateItemDO;
import java.math.BigDecimal;
import java.util.List;
import java.util.Map;

/**
 * 定额费率项 Service 接口
 */
public interface QuotaRateItemService {

    /**
     * 创建费率模式节点（在定额专业下创建 rate_mode 节点）
     */
    Long createRateModeNode(QuotaRateModeNodeSaveReqVO createReqVO);

    /**
     * 创建费率项
     */
    Long createRateItem(QuotaRateItemSaveReqVO createReqVO);

    /**
     * 更新费率项
     */
    void updateRateItem(QuotaRateItemSaveReqVO updateReqVO);

    /**
     * 删除费率项
     */
    void deleteRateItem(Long id);

    /**
     * 获取费率项
     */
    QuotaRateItemDO getRateItem(Long id);

    /**
     * 获取费率项详情（含字段绑定）
     */
    QuotaRateItemRespVO getRateItemDetail(Long id);

    /**
     * 获取费率项列表
     */
    List<QuotaRateItemRespVO> getRateItemList(Long catalogItemId, Long parentId);

    /**
     * 获取费率项树（含字段绑定）
     */
    List<QuotaRateItemRespVO> getRateItemTree(Long catalogItemId);

    /**
     * 同级交换排序
     */
    void swapSort(Long nodeId1, Long nodeId2);

    /**
     * 移动节点到指定位置（重新计算所有受影响节点的排序值）
     * 
     * @param nodeId 要移动的节点ID
     * @param targetNodeId 目标位置节点ID（移动到该节点之前）
     */
    void moveNode(Long nodeId, Long targetNodeId);

    /**
     * 配置动态取值规则
     * 
     * 支持两种规则：
     * 1. 阶梯规则（tiers）：必填，根据基数值匹配阈值区间，返回对应字段值
     * 2. 增量规则（increments）：可选，在阶梯基础上叠加增量计算
     */
    void configValueRules(QuotaRateValueRulesReqVO reqVO);

    /**
     * 计算动态字段值（默认使用阶梯规则）
     * 
     * 计算逻辑：
     * 1. 根据基数值匹配阶梯规则，获取基础字段值（必须配置）
     * 2. 如果配置了增量规则，在基础值上叠加增量（可选）
     * 
     * 示例：
     * - 基数50万以内：字段1=0.224%
     * - 基数50-100万：字段1=0.301%
     * - 基数超过100万：在0.301%基础上，每增加100万增加0.036%
     * 
     * @param rateItemId 费率项ID
     * @param baseValue 基数值（用户输入）
     * @return 计算后的字段值映射，key为字段索引，value为计算值
     */
    Map<Integer, BigDecimal> calculateDynamicFields(Long rateItemId, BigDecimal baseValue);

    /**
     * 验证费率项存在
     */
    QuotaRateItemDO validateRateItemExists(Long id);
}
