package com.ghy.payment.service;

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 java.util.List;
import java.util.Map;
import java.util.Set;

/**
 * 财务细单接口
 *
 * @author HH 2022/4/25
 */
public interface FinancialDetailService {

    /**
     * @param countTime            是否查询准确时间
     * @param financialDetailTypes 子财务单类型
     * @param payeeId              收款人id
     * @return 月份集合
     */
    List<FinancialCountResponse> count(String countTime, String billingState, List<Integer> financialDetailTypes, Integer payeeId);

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

    List<FinancialDetail> selectListByOrderDetailId(Long orderDetailId);

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

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

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


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

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

    List<FinancialDetail> selectByOrderDetailIds(Set<Long> orderDetailIds);

    /**
     * @param ids 财务细单ids
     * @return 删除结果
     */
    int deleteFinancialDetailByIds(String ids);

    int deleteFinancialDetailByOrderDetailId(Long orderDetailId);

    /**
     * 校验财务细单编码是否重复
     *
     * @param financialDetail 财务细单属性
     * @return 校验结果 1存在 0不存在
     */
    String checkFinancialDetailCodeUnique(FinancialDetail financialDetail);

    /**
     * 生成子财务单ID
     */
    String createCode();

    /**
     * 根据订单id集合信息进行查询封装成为map数据，
     *
     * @param orderIdList 订单Id集合信息数据
     * @return 键值队列数据， key-> 订单Id value-> 财务相关信息
     */
    Map<Long, FinancialDetail> byOrderIdInMap(List<Long> orderIdList);

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

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

    /**
     * 查询主财务单下指定类型的子财务单
     *
     * @param financialMasterId 主财务单id
     * @param type              子财务单类型 FinancialDetail.financialDetailType
     */
    List<FinancialDetail> selectByFinancialMasterIdAndType(Long financialMasterId, int type);

    int updatePayStatus(Long id, Integer payStatus);

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

    List<FinancialAccountBillResp> selectFinancialDetailListV2(FinancialAccountBillReq financialAccountBillReq);

}
