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

import com.yhy.module.core.controller.admin.quota.vo.QuotaVariableSettingRespVO;
import com.yhy.module.core.controller.admin.quota.vo.QuotaVariableSettingSaveReqVO;
import com.yhy.module.core.dal.dataobject.quota.QuotaVariableSettingDO;
import java.util.List;
import javax.validation.Valid;

/**
 * 单位工程变量设置 Service 接口
 */
public interface QuotaVariableSettingService {

    /**
     * 创建变量设置
     */
    Long createVariableSetting(@Valid QuotaVariableSettingSaveReqVO createReqVO);

    /**
     * 更新变量设置
     */
    void updateVariableSetting(@Valid QuotaVariableSettingSaveReqVO updateReqVO);

    /**
     * 删除变量设置
     */
    void deleteVariableSetting(Long id);

    /**
     * 获取变量设置详情
     */
    QuotaVariableSettingDO getVariableSetting(Long id);

    /**
     * 根据费率模式节点ID和类别获取列表
     * 
     * @param catalogItemId 费率模式节点ID
     * @param category 类别：division/measure/other/unit_summary
     * @return 变量设置列表
     */
    List<QuotaVariableSettingDO> getVariableSettingList(Long catalogItemId, String category);

    /**
     * 根据费率模式节点ID和类别获取列表（包含定额取费中 variable=true 的数据）
     * 
     * @param catalogItemId 费率模式节点ID
     * @param category 类别：division/measure/other/unit_summary
     * @return 变量设置列表（包含 source 字段标识数据来源）
     */
    List<QuotaVariableSettingRespVO> getVariableSettingListWithFeeItems(Long catalogItemId, String category);

    /**
     * 根据费率模式节点ID获取所有类别的列表
     * 
     * @param catalogItemId 费率模式节点ID
     * @return 变量设置列表
     */
    List<QuotaVariableSettingDO> getVariableSettingListAll(Long catalogItemId);

    /**
     * 根据费率模式节点ID获取所有类别的列表（包含定额取费中 variable=true 的数据）
     * 
     * @param catalogItemId 费率模式节点ID
     * @return 变量设置列表（包含 source 字段标识数据来源）
     */
    List<QuotaVariableSettingRespVO> getVariableSettingListAllWithFeeItems(Long catalogItemId);

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

    /**
     * 验证变量设置是否存在
     */
    void validateVariableSettingExists(Long id);

    /**
     * 根据定额专业节点ID获取所有类别的列表（包含汇总值计算）
     * 
     * @param catalogItemId 定额专业节点ID
     * @param compileTreeId 编制模式树的单位工程节点ID（用于计算汇总值）
     * @param baseNumberRangeIds 基数范围选中的节点ID列表（可选，为空时使用整个单位工程）
     * @return 变量设置列表（包含 summaryValue 字段）
     */
    List<QuotaVariableSettingRespVO> getVariableSettingListAllWithSummary(
        Long catalogItemId, 
        Long compileTreeId, 
        List<Long> baseNumberRangeIds
    );

    /**
     * 根据编制树ID获取所有变量设置（自动合并所有定额专业）
     * 一次性查询该单位工程使用的所有定额专业的变量设置，并计算汇总值
     * 
     * @param compileTreeId 编制模式树的单位工程节点ID
     * @param baseNumberRangeIds 基数范围选中的节点ID列表（可选，为空时使用整个单位工程）
     * @return 变量设置列表（按类别分组，包含 summaryValue 字段）
     */
    List<QuotaVariableSettingRespVO> getVariableSettingListByCompileTree(
        Long compileTreeId, 
        List<Long> baseNumberRangeIds
    );
}
