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

import com.yhy.module.core.controller.admin.workbench.vo.WbUnitInfoRespVO;
import com.yhy.module.core.controller.admin.workbench.vo.WbUnitInfoSaveReqVO;
import com.yhy.module.core.controller.admin.workbench.vo.WbUsedQuotaSpecialtyRespVO;
import java.util.List;
import javax.validation.Valid;

/**
 * 单位工程信息 Service 接口
 *
 * @author yhy
 */
public interface WbUnitInfoService {

    /**
     * 获取单位工程信息
     *
     * @param compileTreeId 编制树节点ID（单位工程节点）
     * @return 单位工程信息
     */
    WbUnitInfoRespVO getByCompileTreeId(Long compileTreeId);

    /**
     * 保存单位工程信息
     *
     * @param saveReqVO 保存信息
     * @return ID
     */
    Long save(@Valid WbUnitInfoSaveReqVO saveReqVO);

    /**
     * 删除单位工程信息（根据编制树节点ID）
     *
     * @param compileTreeId 编制树节点ID
     */
    void deleteByCompileTreeId(Long compileTreeId);

    /**
     * 校验工程编号在项目范围内唯一
     *
     * @param projectId 项目ID
     * @param unitCode 工程编号
     * @param selfId 自身ID（更新时排除）
     */
    void validateUnitCodeUnique(Long projectId, String unitCode, Long selfId);

    // ==================== 单位工程级费率及取费相关方法 ====================

    /**
     * 获取单位工程的费率模式绑定列表
     *
     * @param compileTreeId 编制树节点ID（单位工程节点）
     * @return 费率模式绑定列表
     */
    List<java.util.Map<String, Object>> getUnitRateModeBindings(Long compileTreeId);

    /**
     * 切换单位工程的费率模式
     *
     * @param compileTreeId 编制树节点ID（单位工程节点）
     * @param quotaCatalogItemId 定额专业ID
     * @param rateModeId 费率模式ID
     */
    void switchUnitRateMode(Long compileTreeId, Long quotaCatalogItemId, Long rateModeId);

    /**
     * 获取单位工程的费率配置
     *
     * @param compileTreeId 编制树节点ID（单位工程节点）
     * @param quotaCatalogItemId 定额专业ID
     * @return 费率配置
     */
    java.util.Map<String, Object> getUnitRateConfig(Long compileTreeId, Long quotaCatalogItemId);

    /**
     * 保存单位工程的费率配置
     *
     * @param compileTreeId 编制树节点ID（单位工程节点）
     * @param quotaCatalogItemId 定额专业ID
     * @param rateModeId 费率模式ID
     * @param rateSettings 费率覆写值
     * @param feeSettings 取费覆写值
     */
    void saveUnitRateConfig(Long compileTreeId, Long quotaCatalogItemId, Long rateModeId,
                            java.util.Map<String, Object> rateSettings, java.util.Map<String, Object> feeSettings);

    /**
     * 获取单位工程使用的定额专业列表
     *
     * @param compileTreeId 编制树节点ID（单位工程节点）
     * @return 定额专业列表
     */
    List<WbUsedQuotaSpecialtyRespVO> getUsedQuotaSpecialtiesByUnit(Long compileTreeId);

    /**
     * 获取项目下所有使用的定额专业列表（合并所有单位工程）
     *
     * @param projectId 项目ID
     * @return 定额专业列表（去重）
     */
    List<WbUsedQuotaSpecialtyRespVO> getUsedQuotaSpecialtiesByProject(Long projectId);
}
