package com.ghy.payment.mapper;

import com.ghy.payment.domain.FinancialDetail;
import com.ghy.payment.request.FinancialAccountBillReq;
import com.ghy.payment.response.FinancialAccountBillResp;
import com.ghy.payment.response.FinancialCountResponse;
import org.apache.ibatis.annotations.Param;

import java.util.Collection;
import java.util.List;
import java.util.Set;

/**
 * 财务细单(转派后产生的订单)的mapper层
 *
 * @author HH 2022/4/25
 */
public interface FinancialDetailMapper {

    /**
     * @return 月份集合
     */
    List<FinancialCountResponse> count(FinancialCountResponse response);

    /**
     * @param orderDetailId 细单id
     * @return 细单关联财务单
     */
    FinancialDetail selectByOrderDetailId(@Param("orderDetailId") Long orderDetailId);

    /**
     * @param financialDetail 财务细单属性
     * @return 成功条数
     */
    int insertFinancialDetail(FinancialDetail financialDetail);

    /**
     * @param financialDetail 财务细单属性
     * @return 成功条数
     */
    int updateFinancialDetail(FinancialDetail financialDetail);

    /**
     * @param financialDetail 财务细单入参
     * @return 财务细单集合
     */
    List<FinancialDetail> selectFinancialDetailList(FinancialDetail financialDetail);

    List<FinancialAccountBillResp> selectFinancialDetailListV2(FinancialAccountBillReq financialAccountBillReq);

    /**
     * @param financialDetailId 财务细单id
     * @return 财务细单
     */
    FinancialDetail selectById(Long financialDetailId);

    /**
     * @param financialMasterId 主财务单ID
     * @return 财务细单
     */
    List<FinancialDetail> selectByFinancialMasterId(Long financialMasterId);

    /**
     * 批量删除财务细单信息
     *
     * @param financialDetailIds 需要删除的数据ID
     * @return 结果
     */
    int deleteFinancialDetailByIds(Long[] financialDetailIds);

    int deleteFinancialDetailByOrderDetailId(Long orderDetailId);

    /**
     * @param financialDetailCode 财务细单编码
     * @return 财务细单信息
     */
    FinancialDetail checkFinancialDetailCodeUnique(String financialDetailCode);

    /**
     * 根据订单id集合信息进行批量数据查询
     *
     * @param orderDetailIds 订单Id集合信息。
     * @return FinancialDetail实体集合信息。
     */
    List<FinancialDetail> selectByOrderDetailIds(@Param("orderDetailIds") Collection<Long> orderDetailIds);

    /**
     * 撤销支付成功
     *
     * @param reverseId 撤销支付ID
     */
    void payReverseSucceeded(String reverseId);

    /**
     * 通过主财务单ID批量更新子财务单
     * 可更新字段: payType, payStatus, payTime
     *
     * @param financialDetail 子财务单
     */
    void updateByFinancialMasterId(FinancialDetail financialDetail);

    int updatePayStatus(@Param("id") Long id, @Param("payStatus") Integer payStatus);

    /**
     * 退款成功
     *
     * @param reverseId Adapay撤销支付ID
     */
    void refundSucceeded(String reverseId);
}
