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

import com.red.circle.other.infra.database.mongo.entity.team.team.TeamProfile;
import com.red.circle.other.inner.model.cmd.team.StatusTeamBatchCmd;
import com.red.circle.other.inner.model.cmd.team.TeamTableQryCmd;
import com.red.circle.other.inner.model.dto.agency.agency.TeamContact;
import com.red.circle.other.inner.model.dto.agency.agency.TeamCounter;
import com.red.circle.other.inner.model.dto.agency.agency.TeamRemark;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.function.Consumer;

/**
 * 团队服务.
 *
 * @author pengliang on 2022/12/6
 */
public interface TeamProfileService {

  /**
   * 批量创建.
   */
  void createBatch(List<TeamProfile> teamProfiles);

  /**
   * 团队资料.
   */
  void create(TeamProfile teamProfile);

  /**
   * 是否存在团长.
   */
  boolean existsOwnUserId(Long ownUserId);

  /**
   * 修改团队资料.
   */
  void updateByIdSelective(TeamProfile teamProfile);

  /**
   * 批量修改团队状态-后台管理.
   */
  void updateTeamStatusBackBatch(StatusTeamBatchCmd param);

  /**
   * 添加联系方式.
   */
  void addTeamContact(Long teamId, TeamContact contact);

  /**
   * 移除联系方式.
   */
  void removeTeamContact(Long teamId, String contactId);

  /**
   * 添加备注.
   */
  void addTeamRemarks(Long teamId, TeamRemark remarks);

  /**
   * 移除备注.
   */
  void removeTeamRemarks(Long teamId, String remarkId);

  /**
   * 获取团队资料.
   */
  TeamProfile getById(Long id);

    /**
     * 批量获取团队资料
     */
  List<TeamProfile> getByIds(Set<Long> ids);

  /**
   * 验证团队是否可用.
   */
  boolean checkStatusAvailable(Long id);

  /**
   * 获取团队资料列表.
   */
  List<TeamProfile> list(TeamTableQryCmd query);

  /**
   * 获取区域团队资料.
   */
  List<TeamProfile> listRegion(String region, Integer limit);

  @Deprecated
  List<TeamProfile> listAll(String sysOrigin);

  List<TeamProfile> listRegionAll(String region);

  /**
   * 获得区域下的所有团队ID.
   */
  Set<Long> listIdByRegion(String regionId);

  /**
   * 获取团队资料.
   */
  TeamProfile getByOwnUserId(Long ownUserId);

  /**
   * 获取团队资料.
   */
  List<TeamProfile> getByOwnUserIds(Set<Long> ownUserIds);

  /**
   * 获取团队资料列表.
   */
  List<TeamProfile> listByIds(Set<Long> ids);

  /**
   * 获取团队资料映射表.
   */
  Map<Long, TeamProfile> mapProfileByIds(Set<Long> ids);

  /**
   * 累计成员数量.
   */
  void incrCounterMember(Long id);

  /**
   * 累计管理员数量.
   */
  void incrCounterAdmin(Long id);

  /**
   * 累减成员数量.
   */
  void decrCounterMember(Long id);

  /**
   * 累减所有数量.
   */
  void decrCounter(Long id);

  /**
   * 累减管理员数量.
   */
  void decrCounterAdmin(Long id);

  /**
   * 修改成员数量.
   */
  void updateCounterMemberQuantity(Long id, Long memberQuantity);

  /**
   * 修改统计数量.
   */
  void updateCounter(Long id, TeamCounter counter);

  /**
   * 房间资料-状态正常, 扫描.
   */
  void scanStatusAvailable(Consumer<List<TeamProfile>> execute, Integer limit);

  /**
   * 获取正常团队信息.
   */
  List<TeamProfile> listStatusAvailable(Set<Long> teamIds);

  /**
   * 修改团队名称或头像.
   */
  void updateTeamNickNameOrAvatar(TeamProfile teamProfile);

  /**
   * 修改团长.
   */
  void updateTeamOwn(Long teamId, Long newOwnUserId, Long backUpdateUserId);

  /**
   * 移除房间相关信息.
   */
  void removeBatchById(List<Long> ids);

  /**
   * 获得拥有者id集合.
   */
  Map<Long, Long> mapOwnUserIdsByIds(Set<Long> ids);

  /**
   * 获得可用的团队集合.
   */
  List<TeamProfile> listStatusAvailable();

  /**
   * 获得代理区域ID.
   */
  String getTeamRegionId(Long id);

  /**
   * 获得团队拥有者用户ID.
   */
  Long getOwnUserIdById(Long id);

}
