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

import com.red.circle.framework.mybatis.service.BaseService;
import com.red.circle.other.infra.database.rds.entity.user.user.CpRelationship;
import java.math.BigDecimal;
import java.util.List;
import java.util.Set;

/**
 * <p>
 * 用户cp关系 服务类.
 * </p>
 *
 * @author pengliang
 * @since 2021-04-13
 */
public interface CpRelationshipService extends BaseService<CpRelationship> {

  /**
   * 获取最近cp.
   */
  List<CpRelationship> listLatestCp(String sysOrigin, Integer size);

  /**
   * 获取最近cp, 排除指定用户id.
   */
  List<CpRelationship> listLatestCp(String sysOrigin, Set<Long> excludeUserId, Integer size);

  /**
   * 是否互为cp.
   */
  boolean existsCp(Long userId, Long cpUserId);

  /**
   * 获取分手中的cp信息集合
   */
  List<CpRelationship> getDismissingByUserId(Long userId);

  /**
   * 获取cp用户id.
   *
   * @param userId 用户id
   * @return cp id
   */
  List<Long> getCpUserId(Long userId);

  /**
   * 获取cp信息集合
   */
  List<CpRelationship> getByUserId(Long userId);

  /**
   * 获取cp信息.
   */
  CpRelationship getByUserId(Long userId, Long cpUserId);

  /**
   * 获取cpValId
   *
   * @param userId 用户id
   * @return ignore
   */
  Long getCpValByUserId(Long userId);

  /**
   * 根据id删除
   */
  void deleteById(Long id);

  /**
   * 组建cp.
   *
   * @param sendApplyUserId   用户id
   * @param acceptApplyUserId cp用户id
   * @param bindCpValId       cp值id
   * @param sysOrigin         系统
   */
  void addCp(Long sendApplyUserId, Long acceptApplyUserId, Long bindCpValId, String sysOrigin);

  /**
   * 获取cp信息.
   *
   * @param userId 用户id param account 用户赠送的礼物价值
   */
  void updateAccountByUserId(Long userId, BigDecimal account);

  /**
   * 获取cp信息.
   *
   * @param userId 用户id
   * @return
   */
  CpRelationship getByUserIdOrCpUserId(Long userId);

  /**
   * 获取用户正常CP数量.
   *
   * @param userId 用户id
   * @return CP数量
   */
  int countCp(Long userId);

  /**
   * 获取分手中的CP关系.
   *
   * @param userId 用户id
   * @param cpUserId cp用户id
   * @return CP关系
   */
  CpRelationship getDismissingCp(Long userId, Long cpUserId);

  /**
   * 更新CP关系为分手中.
   *
   * @param userId 用户id
   */
  void updateToDismissing(Long userId, Long cpUserId);

  /**
   * 复合CP（更新为正常状态）.
   *
   * @param userId 用户id
   * @param cpUserId cp用户id
   */
  void reconcile(Long userId, Long cpUserId);

  /**
   * 获取7天前分手中的CP关系列表.
   *
   * @return CP关系列表
   */
  List<CpRelationship> listExpiredDismissingCp();

}
