package com.openhis.administration.service;

import java.math.BigDecimal;
import java.util.List;

import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.IService;
import com.openhis.administration.domain.ChargeItemDefinition;
import com.openhis.administration.domain.HealthcareService;
import com.openhis.administration.dto.ChargeItemDefDetailPriceDto;

/**
 * 费用定价管理Service接口
 *
 * @author system
 * @date 2025-02-20
 */
public interface IChargeItemDefinitionService extends IService<ChargeItemDefinition> {

    /**
     * 获取定价分页列表
     *
     * @param chargeItemDefinition 定价查询条件
     * @param pageNo 页码
     * @param pageSize 页面大小
     * @return 定价分页列表
     */
    Page<ChargeItemDefinition> getPage(ChargeItemDefinition chargeItemDefinition, Integer pageNo, Integer pageSize);

    /**
     * 新增费用定价
     *
     * @param chargeItemDefinition 新增内容
     * @return 新增结果
     */
    boolean addChargeItemDefinition(ChargeItemDefinition chargeItemDefinition);

    /**
     * 删除费用定价
     *
     * @param id 费用定价id
     * @return 新增结果
     */
    boolean deleteChargeItemDefinition(Long id);

    /**
     * 通过服务管理新增费用定价
     *
     * @param healthcareService 服务管理
     * @param chargeItemDefinition 费用定价
     * @return 新增结果
     */
    boolean addChargeItemDefinitionByHealthcareService(HealthcareService healthcareService,
        ChargeItemDefinition chargeItemDefinition);

    /**
     * 创建费用定价和详情
     *
     * @param chargeName 名称
     * @param typeCode 财务类别
     * @param ybCode 医保类别
     * @param unitCode 包装单位
     * @param purchasePrice 购入价
     * @param retailPrice 零售价
     * @param maximumRetailPrice 最高零售价
     * @param orgId 机构ID
     * @param instanceTable 关联表
     * @param instanceId 关联ID
     */
    void addChargeItemDefinitionAndDetail(String chargeName, String typeCode, String ybCode, String unitCode,
        BigDecimal purchasePrice, BigDecimal retailPrice, BigDecimal maximumRetailPrice, Long orgId,
        String instanceTable, Long instanceId);

    /**
     * Desc: 根据 货品ID集合查询 价格主表 集合
     * 
     * @param itemIds
     * @Author raymond
     * @Date 22:39 2025/10/18
     * @return java.util.List<com.openhis.administration.domain.ChargeItemDefinition>
     **/
    List<ChargeItemDefinition> searchChargeItemDefinitionByMedIds(List<Long> itemIds);

    /**
     * Desc: 根据参数加载对象
     * 
     * @param instanceId
     * @param instanceTable
     * @param statusEnum
     * @Author raymond
     * @Date 11:15 2025/10/30
     * @return com.openhis.administration.domain.ChargeItemDefinition
     **/
    ChargeItemDefinition getChargeItemDefinitionEntity(Long instanceId, String instanceTable, Integer statusEnum);

    /**
     * Desc: 根据 conditionCode 和 货品ID 获取 原价和零售价
     *
     * @param conditionCode
     * @param instanceId
     * @Author raymond
     * @Date 21:44 2025/11/1
     * @return com.openhis.administration.domain.ChargeItemDefinition
     **/
    ChargeItemDefDetailPriceDto getMedPriceByParam(String conditionCode, Long instanceId);

    /**
     * Desc: 根据 conditionCode 和 耗材ID 获取 原价和零售价
     *
     * @param conditionCode
     * @param instanceId
     * @Author raymond
     * @Date 07:23 2025/11/4
     * @return com.openhis.administration.dto.ChargeItemDefDetailPriceDto
     **/
    ChargeItemDefDetailPriceDto getDevicePriceByParam(String conditionCode, Long instanceId);

    /**
     * Desc: 根据 状态和货品ID 加载诊疗或挂号的最新零售价
     * 
     * @param statusEnum
     * @param instanceId
     * @Author raymond
     * @Date 22:02 2025/11/1
     * @return com.openhis.administration.dto.ChargeItemDefDetailPriceDto
     **/
    ChargeItemDefDetailPriceDto getProductPrice(Integer statusEnum, Long instanceId);
}