package com.red.circle.other.infra.database.rds.service.user.user;


import com.red.circle.framework.dto.PageResult;
import com.red.circle.framework.mybatis.service.BaseService;
import com.red.circle.other.infra.database.rds.entity.user.user.CpApply;
import com.red.circle.other.infra.enums.user.user.CpApplyStatus;
import com.red.circle.other.inner.model.cmd.user.CpApplyQryCmd;
import java.util.List;

/**
 * <p>
 * CP申请记录 服务类.
 * </p>
 *
 * @author pengshigang
 * @since 2021-07-13
 */
public interface CpApplyService extends BaseService<CpApply> {

  /**
   * 解散cp.
   */
  void dismiss(Long requestUserId);

  /**
   * 解散指定类型关系申请.
   */
  void dismiss(Long requestUserId, String relationType);

  /**
   * 获取申请记录.
   *
   * @param acceptApplyUserId 接收人
   * @param sendApplyUserId   发送人
   * @return 申请记录ID.
   */
  Long getId(Long acceptApplyUserId, Long sendApplyUserId);

  /**
   * 获取指定类型申请记录.
   */
  Long getId(Long acceptApplyUserId, Long sendApplyUserId, String relationType);

  /**
   * 申请记录是否存在.
   *
   * @param acceptApplyUserId 接收人
   * @param sendApplyUserId   发送人
   * @return true　存在，false 不存在
   */
  boolean exists(Long acceptApplyUserId, Long sendApplyUserId);

  /**
   * 指定类型申请记录是否存在.
   */
  boolean exists(Long acceptApplyUserId, Long sendApplyUserId, String relationType);

  /**
   * 是否存在发送记录.
   *
   * @param sendApplyUserId 发送人
   * @return true 存在，false 不存在
   */
  boolean existsNotProcessSendApply(Long sendApplyUserId);

  /**
   * 是否存在指定类型发送记录.
   */
  boolean existsNotProcessSendApply(Long sendApplyUserId, String relationType);

  /**
   * 改变状态同意.
   *
   * @param id     记录id
   * @param status 状态
   * @return true 成功，false 失败
   */
  boolean changeStatusById(Long id, CpApplyStatus status);

  /**
   * 只把等待中的申请置为超时.
   */
  boolean expireWaitById(Long id);

  /**
   * 清理用户相关超过 24 小时仍处于等待状态的申请.
   */
  void expireOverdueWaitApplies(Long userId);

  /**
   * 拒绝所有等待状态在用户.
   *
   * @param acceptApplyUserId 接收用户
   */
  void refuseStatusWait(Long acceptApplyUserId);

  /**
   * 拒绝指定类型所有等待状态.
   */
  void refuseStatusWait(Long acceptApplyUserId, String relationType);

  /**
   * 拒绝两个用户之间除指定申请外的其他等待申请.
   */
  List<Long> refuseOtherWaitBetweenUsers(Long excludeApplyId, Long userId, Long cpUserId);

  /**
   * 拒绝两个用户之间除指定申请外的其他等待申请，并返回被拒绝的申请记录.
   */
  List<CpApply> refuseOtherWaitAppliesBetweenUsers(Long excludeApplyId, Long userId, Long cpUserId);

  /**
   * 拒绝指定用户所有同类型等待申请，并返回被拒绝的申请记录.
   */
  List<CpApply> refuseWaitAppliesByUserAndRelation(Long excludeApplyId, Long userId,
      String relationType);

  /**
   * 获取两个用户之间已拒绝的申请.
   */
  List<CpApply> listRefuseBetweenUsers(Long userId, Long cpUserId);

  /**
   * 获取我拒绝都信息.
   */
  List<CpApply> listRefuse(Long userId);

  /**
   * 获取cp申请信息.
   */
  PageResult<CpApply> pageCpApply(CpApplyQryCmd query);
}
