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

import com.yhy.module.core.controller.admin.quota.vo.QuotaAdjustmentSaveReqVO;
import com.yhy.module.core.dal.dataobject.quota.QuotaAdjustmentDO;

import javax.validation.Valid;
import java.math.BigDecimal;
import java.util.List;
import java.util.Map;

/**
 * 定额调整设置 Service 接口
 */
public interface QuotaAdjustmentService {

    /**
     * 创建定额调整设置
     *
     * @param createReqVO 创建信息
     * @return 编号
     */
    Long createQuotaAdjustment(@Valid QuotaAdjustmentSaveReqVO createReqVO);

    /**
     * 更新定额调整设置
     *
     * @param updateReqVO 更新信息
     */
    void updateQuotaAdjustment(@Valid QuotaAdjustmentSaveReqVO updateReqVO);

    /**
     * 删除定额调整设置
     *
     * @param id 编号
     */
    void deleteQuotaAdjustment(Long id);

    /**
     * 获得定额调整设置
     *
     * @param id 编号
     * @return 定额调整设置
     */
    QuotaAdjustmentDO getQuotaAdjustment(Long id);

    /**
     * 获得定额调整设置列表
     *
     * @param quotaItemId 定额子目ID
     * @return 定额调整设置列表
     */
    List<QuotaAdjustmentDO> getQuotaAdjustmentList(Long quotaItemId);

    /**
     * 交换排序
     *
     * @param id1 调整设置ID1
     * @param id2 调整设置ID2
     */
    void swapSort(Long id1, Long id2);

    /**
     * 计算调整后的消耗量
     *
     * @param quotaItemId 定额子目ID
     * @param originalConsumeQty 原始消耗量
     * @return 调整后的消耗量
     */
    BigDecimal calculateAdjustedConsumeQty(Long quotaItemId, BigDecimal originalConsumeQty);

    /**
     * 计算指定工料机的调整后消耗量
     *
     * @param quotaItemId 定额子目ID
     * @param resourceCode 工料机编码
     * @param originalDosage 原始定额消耗量
     * @return 调整后的消耗量
     */
    BigDecimal calculateAdjustedDosage(Long quotaItemId, String resourceCode, BigDecimal originalDosage);

    /**
     * 保存材料调整明细
     *
     * @param adjustmentId 调整设置ID
     * @param items 材料明细列表
     */
    void saveMaterialItems(Long adjustmentId, List<Map<String, Object>> items);

    /**
     * 获取材料调整明细
     *
     * @param adjustmentId 调整设置ID
     * @return 材料明细列表
     */
    List<Map<String, Object>> getMaterialItems(Long adjustmentId);

    /**
     * 获取可配置的类别列表
     *
     * @param quotaItemId 定额子目ID
     * @return 类别列表
     */
    List<Map<String, Object>> getAvailableCategories(Long quotaItemId);

    /**
     * 保存动态调整配置
     *
     * @param adjustmentId 调整设置ID
     * @param categories 类别配置列表
     */
    void saveDynamicConfig(Long adjustmentId, List<Map<String, Object>> categories);

    /**
     * 获取动态调整配置
     *
     * @param adjustmentId 调整设置ID
     * @return 类别配置列表
     */
    List<Map<String, Object>> getDynamicConfig(Long adjustmentId);

    /**
     * 计算动态调整结果
     *
     * @param adjustmentId 调整设置ID
     * @param inputValues 输入值映射（类别ID: 输入值）
     * @return 调整结果映射（类别ID: 调整结果）
     */
    Map<String, BigDecimal> calculateDynamic(Long adjustmentId, Map<String, BigDecimal> inputValues);

    /**
     * 保存系数调整配置
     *
     * @param adjustmentId 调整设置ID
     * @param categories 类别配置列表
     */
    void saveCoefficientConfig(Long adjustmentId, List<Map<String, Object>> categories);

    /**
     * 获取系数调整配置
     *
     * @param adjustmentId 调整设置ID
     * @return 类别配置列表
     */
    List<Map<String, Object>> getCoefficientConfig(Long adjustmentId);

    /**
     * 获取可选的工料机列表
     *
     * @param quotaItemId 定额子目ID
     * @return 工料机列表
     */
    List<Map<String, Object>> getAvailableResources(Long quotaItemId);

    /**
     * 保存动态合并配置
     *
     * @param adjustmentId 调整设置ID
     * @param resources 工料机配置列表
     */
    void saveMergeConfig(Long adjustmentId, List<Map<String, Object>> resources);

    /**
     * 获取动态合并配置
     *
     * @param adjustmentId 调整设置ID
     * @return 工料机配置列表
     */
    List<Map<String, Object>> getMergeConfig(Long adjustmentId);

    /**
     * 计算动态合并结果
     *
     * @param adjustmentId 调整设置ID
     * @param inputValues 输入值映射（工料机ID: 输入值）
     * @return 调整结果映射（工料机ID: 调整结果）
     */
    Map<String, BigDecimal> calculateMerge(Long adjustmentId, Map<String, BigDecimal> inputValues);
}
