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

import com.yhy.module.core.controller.admin.quota.vo.QuotaFeeItemWithRateRespVO;
import java.util.List;

/**
 * 单位工程取费项设定 Service 接口
 */
public interface WbUnitFeeSettingService {

    /**
     * 获取单位工程的取费项列表（合并标准库数据与覆写值）
     * 
     * @param unitId 单位工程ID
     * @return 取费项列表（已合并覆写值）
     */
    List<QuotaFeeItemWithRateRespVO> getMergedFeeList(Long unitId);

    /**
     * 根据分部分项节点ID获取取费项列表
     * 
     * @param divisionId 分部分项节点ID（定额节点）
     * @return 取费项列表（已合并覆写值）
     */
    List<QuotaFeeItemWithRateRespVO> getMergedFeeListByDivisionId(Long divisionId);

    /**
     * 根据分部分项节点ID获取取费项列表（使用预计算的分类汇总，避免重复查询工料机）
     * 
     * @param divisionId 分部分项节点ID（定额节点）
     * @param categorySums 预计算的分类汇总（来自调用方已加载的工料机数据）
     * @return 取费项列表（已合并覆写值，含子单价计算）
     */
    List<QuotaFeeItemWithRateRespVO> getMergedFeeListByDivisionId(Long divisionId, 
            java.util.Map<Long, com.yhy.module.core.controller.admin.workbench.vo.price.CategoryPriceSum> categorySums);

    /**
     * 保存取费项覆写值
     * 
     * @param divisionId 分部分项节点ID（定额节点）
     * @param feeItemId 取费项ID
     * @param name 名称覆写值
     * @param ratePercentage 费率代号覆写值
     * @param code 代号覆写值
     * @param feeCategory 费用归属覆写值
     * @param baseDescription 基数说明覆写值
     */
    void saveOverride(Long divisionId, Long feeItemId, String name, String ratePercentage, 
                      String code, String feeCategory, String baseDescription);

    /**
     * 批量保存取费项覆写值
     * 
     * @param divisionId 分部分项节点ID（定额节点）
     * @param overrides 覆写值列表
     */
    void batchSaveOverrides(Long divisionId, List<FeeOverrideDTO> overrides);

    /**
     * 删除取费项（标记为用户删除）
     * 
     * @param divisionId 分部分项节点ID（定额节点）
     * @param feeItemId 取费项ID
     */
    void markAsDeleted(Long divisionId, Long feeItemId);

    /**
     * 初始化定额节点的取费项设定（创建快照）
     * 
     * @param divisionId 分部分项节点ID（定额节点）
     */
    void initializeSettings(Long divisionId);

    /**
     * 取费项覆写 DTO
     */
    class FeeOverrideDTO {
        private Long feeItemId;
        private Long rateItemId;
        private Integer sortOrder;
        private String name;
        private String ratePercentage;
        private String code;
        private String feeCategory;
        private String baseDescription;
        private Boolean hidden;
        private Boolean variable;
        private Boolean userDeleted;
        private java.util.Map<String, Object> calcBase;

        // Getters and Setters
        public Long getFeeItemId() { return feeItemId; }
        public void setFeeItemId(Long feeItemId) { this.feeItemId = feeItemId; }
        public Long getRateItemId() { return rateItemId; }
        public void setRateItemId(Long rateItemId) { this.rateItemId = rateItemId; }
        public Integer getSortOrder() { return sortOrder; }
        public void setSortOrder(Integer sortOrder) { this.sortOrder = sortOrder; }
        public String getName() { return name; }
        public void setName(String name) { this.name = name; }
        public String getRatePercentage() { return ratePercentage; }
        public void setRatePercentage(String ratePercentage) { this.ratePercentage = ratePercentage; }
        public String getCode() { return code; }
        public void setCode(String code) { this.code = code; }
        public String getFeeCategory() { return feeCategory; }
        public void setFeeCategory(String feeCategory) { this.feeCategory = feeCategory; }
        public String getBaseDescription() { return baseDescription; }
        public void setBaseDescription(String baseDescription) { this.baseDescription = baseDescription; }
        public Boolean getHidden() { return hidden; }
        public void setHidden(Boolean hidden) { this.hidden = hidden; }
        public Boolean getVariable() { return variable; }
        public void setVariable(Boolean variable) { this.variable = variable; }
        public Boolean getUserDeleted() { return userDeleted; }
        public void setUserDeleted(Boolean userDeleted) { this.userDeleted = userDeleted; }
        public java.util.Map<String, Object> getCalcBase() { return calcBase; }
        public void setCalcBase(java.util.Map<String, Object> calcBase) { this.calcBase = calcBase; }
    }
}
