package com.openhis.financial.service;

import java.util.List;

import com.baomidou.mybatisplus.extension.service.IService;
import com.openhis.common.enums.PaymentKind;
import com.openhis.common.enums.PaymentStatus;
import com.openhis.common.enums.ybenums.YbMdtrtCertType;
import com.openhis.financial.domain.Contract;
import com.openhis.financial.domain.PaymentReconciliation;
import com.openhis.financial.model.PaymentReconciliationAccountDel;
import com.openhis.financial.model.PaymentResult;
import com.openhis.financial.model.PaymentedItemModel;
import com.openhis.financial.model.PrePaymentResult;
import com.openhis.yb.dto.PaymentInpatientDto;

/**
 * 付款管理Service接口
 *
 * @author system
 * @date 2025-02-20
 */
public interface IPaymentReconciliationService extends IService<PaymentReconciliation> {

    /**
     * 根据支付id获取对应收费项目的id列表
     *
     * @param paymentIdList 支付id列表
     * @return 收费项目的id列表
     */
    List<Long> getChargeItemIdListByPayment(List<Long> paymentIdList);

    /**
     * 更新付款状态：退款中
     *
     * @param paymentIdList 支付id列表
     */
    void updateRefundingStatus(List<Long> paymentIdList);

    /**
     * 【门诊预结算】
     * 
     * @param ybMdtrtCertType 医保凭证类型
     * @param busiCardInfo 读卡获取的密钥
     * @param contractBusNo 合同编号
     * @param paymentedItemList 收费项
     * @return 结果
     */
    PrePaymentResult preSettle(YbMdtrtCertType ybMdtrtCertType, String busiCardInfo, String contractBusNo,
        List<PaymentedItemModel> paymentedItemList);

    /**
     * 【门诊结算】
     * 
     * @param contract 合同
     * @param payTransNo 收费批次号
     * @param byValue 医保凭证类型
     * @param busiCardInfo 读卡获取的密钥
     * @param minpacuntDrugTracCnt 追溯码相关
     * @param mcsTracCnt 追溯码相关
     * @return 结算结果
     */
    PaymentResult settle(Contract contract, String payTransNo, YbMdtrtCertType byValue, String busiCardInfo,
        Integer minpacuntDrugTracCnt, Integer mcsTracCnt);

    /**
     * 更改付款状态
     * 
     * @param id paymentId
     * @param success 付款状态
     */
    void updatePaymentStatusById(Long id, PaymentStatus success);

    /**
     * 更改状态
     * 
     * @param id 主键id
     * @param success 付款状态
     * @param settleId 医保结算id
     */
    void updatePaymentStatusAndSettleIdsById(Long id, PaymentStatus success, Integer outcomeEnum,
        List<String> settleId);

    /**
     * 【住院结算】
     *
     * @param contract 合同
     * @param paymentDto 收费参数
     * @return 结算结果
     */
    PaymentResult inpatientSettle(Contract contract, PaymentInpatientDto paymentDto);

    /**
     * 查询付款实体
     *
     * @param encounterId 就诊id
     * @return 付款实体
     */
    PaymentReconciliation getByEncounterId(Long encounterId, PaymentKind kindEnum);

    /**
     * 查询付款实体
     *
     * @param encounterId 就诊id
     * @return 付款实体
     */
    List<PaymentReconciliation> getListByEncounterId(Long encounterId, PaymentKind paymentKind);

    /**
     * 判断是否已退费
     * 
     * @param paymentId 原单id
     * @return 结果
     */
    boolean isReturn(Long paymentId);

    /**
     * 查询实体集合
     * 
     * @param startTime 开始时间
     * @param endTime 结束时间
     * @param entererId 款员id
     * @param contractNo 合同编号
     * @param success 状态
     * @param returnAll 状态
     * @param clinic 类型
     * @return 集合
     */
    List<PaymentReconciliationAccountDel> getPaymentAccountContract(String startTime, String endTime, Long entererId,
        String contractNo, Integer success, Integer returnAll, Integer clinic);

}
