package com.red.circle.other.infra.database.mongo.service.team.team;

import com.red.circle.framework.dto.PageResult;
import com.red.circle.other.infra.database.mongo.dto.team.TeamSalaryPaymentDetails;
import com.red.circle.other.infra.database.mongo.entity.team.team.TeamPolicyManager;
import com.red.circle.other.infra.database.mongo.entity.team.team.TeamSalaryPayment;
import java.util.List;
import java.util.Map;

/**
 * 团队工资实时支付记录.
 *
 * @author pengshigang on 2023/4/13
 */
public interface TeamSalaryPaymentService {

  /**
   * 后台列表查询.
   */
  PageResult<TeamSalaryPayment> listByCondition(String sysOrigin, Long userId,
      Integer dateNumber, Integer pageNumber, Integer pageSize);

  /**
   * 不存在则创建当月支付记录并返回.
   */
  TeamSalaryPayment createIfAbsent(Long userId, Integer yearMonth, String sysOrigin);

  /**
   * 给记录添加备注.
   */
  void addRemark(String id, String desc);

  /**
   * 发送工资.
   */
  void paymentSalary(String id, TeamSalaryPaymentDetails salaryDetails);

  /**
   * 是否重复支付成员工资.
   *
   * @param id             支付记录
   * @param memberId       成员ID
   * @param regionId       区域ID
   * @param policyLevel    政策等级
   * @param memberTargetId 成员工作id
   * @param checkMember    校验成员还是代理
   * @return true 重复发送, false 允许发送
   */
  Boolean checkRepeatPayment(String id, Long memberId, String regionId, Integer policyLevel,
      String memberTargetId, Boolean checkMember);

  /**
   * 是否重复支付成员工资.
   *
   * @param id          支付记录
   * @param memberId    成员ID
   * @param regionId    区域ID
   * @param policyLevel 政策等级
   * @param checkMember 校验成员还是代理
   * @return true 重复发送, false 允许发送
   */
  Boolean checkRepeatPayment(String id, Long memberId, String regionId,
      Integer policyLevel, Boolean checkMember);

  /**
   * 是否重复支付成员工资.
   *
   * @param id             支付记录
   * @param memberId       成员ID
   * @param regionId       区域ID
   * @param teamBillId     团队账单ID
   * @param policyLevel    政策等级
   * @param memberTargetId 成员工作id
   * @param checkMember    校验成员还是代理
   * @return true 重复发送, false 允许发送
   */
  Boolean checkRepeatAndBillIdPayment(String id, Long memberId, String regionId, Integer teamBillId, Integer policyLevel,
                                      String memberTargetId, Boolean checkMember);

  /**
   * 获得数据.
   */
  TeamSalaryPayment getOneById(String id);

  /**
   * 基于父ID修改子记录状态为已退款.
   *
   * @param id                ID
   * @param salarySendDetails 发送工资记录集合.
   */
  void updateDetails(String id, List<TeamSalaryPaymentDetails> salarySendDetails);

  /**
   * 更新政策.
   */
  void updatePolicyMap(String id, Map<String, TeamPolicyManager> policyMap);

  /**
   * 获得管理政策.
   */
  Map<String, TeamPolicyManager> mapPolicy(String id);

}
