package com.red.circle.other.inner.model.dto.material.props;

import com.red.circle.other.inner.enums.material.NobleVipEnum;
import java.io.Serial;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashSet;
import java.util.List;
import java.util.Objects;
import java.util.Set;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;

/**
 * 贵族能力.
 *
 * @author pengliang on 2021/6/3
 */
@Data
@EqualsAndHashCode(callSuper = false)
@Accessors(chain = true)
public class NobleVipAbility extends PropsAbility {

  @Serial
  private static final long serialVersionUID = 1L;

  /**
   * VIP类型.
   */
  private String vipType;

  /**
   * vip等级.
   */
  private Integer vipLevel;

  /**
   * 管理员数量.
   */
  private Integer adminNumber;

  /**
   * 登录奖励金额.
   */
  private BigDecimal loginRewardsAmount;

  /**
   * 房间最大成员数.
   */
  private Integer roomMaxMember;

  /**
   * 房间头饰ID.
   */
  private Long avatarFrameId;

  /**
   * 贵族能力.
   */
  private PropsNobleVipAbilityDTO nobleVipAbility;

  /**
   * 头像框.
   */
  private PropsResources avatarFrame;

  /**
   * 座驾.
   */
  private PropsResources car;

  /**
   * 聊天气泡.
   */
  private PropsResources chatBubble;

  /**
   * 资料卡框.
   */
  private PropsResources dataCard;

  /**
   * 贵族道具资源编号.
   */
  public Set<Long> noblePropsSourceIds() {
    Set<Long> resources = new HashSet<>();
    if (Objects.nonNull(nobleVipAbility.getAvatarFrameId())) {
      resources.add(nobleVipAbility.getAvatarFrameId());
    }
    if (Objects.nonNull(nobleVipAbility.getCarId())) {
      resources.add(nobleVipAbility.getCarId());
    }
    if (Objects.nonNull(nobleVipAbility.getChatBubbleId())) {
      resources.add(nobleVipAbility.getChatBubbleId());
    }
    if (Objects.nonNull(nobleVipAbility.getDataCardId())) {
      resources.add(nobleVipAbility.getDataCardId());
    }
    return resources;
  }

  /**
   * 所有道具资源配置信息.
   */
  public List<PropsResources> noblePropsResources() {
    List<PropsResources> resources = new ArrayList<>();
    if (Objects.nonNull(avatarFrame)) {
      resources.add(avatarFrame);
    }
    if (Objects.nonNull(car)) {
      resources.add(car);
    }
    if (Objects.nonNull(chatBubble)) {
      resources.add(chatBubble);
    }
    if (Objects.nonNull(dataCard)) {
      resources.add(dataCard);
    }
    return resources;
  }

  public Long avatarFrameId() {
    return Objects.nonNull(nobleVipAbility.getAvatarFrameId())
        && getNobleVipAbility().getAvatarFrameId() > 0
        ? nobleVipAbility.getAvatarFrameId() : null;
  }

  public Long cardId() {
    return Objects.nonNull(nobleVipAbility.getCarId())
        && getNobleVipAbility().getCarId() > 0
        ? nobleVipAbility.getCarId() : null;
  }

  public Long chatBubbleId() {
    return Objects.nonNull(nobleVipAbility.getChatBubbleId())
        && getNobleVipAbility().getChatBubbleId() > 0
        ? nobleVipAbility.getChatBubbleId() : null;
  }

  public Long dataCardId() {
    return Objects.nonNull(nobleVipAbility.getDataCardId())
        && getNobleVipAbility().getDataCardId() > 0
        ? nobleVipAbility.getDataCardId() : null;
  }

  public Long id() {
    return nobleVipAbility.getId();
  }

  public boolean existsVipType(NobleVipEnum... nobleVipEnums) {
    if (Objects.isNull(nobleVipEnums)) {
      return false;
    }

    return Arrays.stream(nobleVipEnums).anyMatch(nobleVipEnum ->
        Objects.equals(nobleVipAbility.getVipType(), nobleVipEnum.name())
    );
  }

  public boolean existsVipTypeNew(NobleVipEnum... nobleVipEnums) {
    if (Objects.isNull(nobleVipEnums)) {
      return false;
    }

    return Arrays.stream(nobleVipEnums).anyMatch(nobleVipEnum ->
        Objects.equals(this.getNobleVipAbility().getVipType(), nobleVipEnum.name())
    );
  }

  public Integer roomMaxMember() {
    return nobleVipAbility.getRoomMaxMember();
  }

  public Integer adminNumber() {
    return nobleVipAbility.getAdminNumber();
  }

  public Integer vipLevel() {
    return nobleVipAbility.getVipLevel();
  }

  public BigDecimal loginRewardsAmount() {
    return nobleVipAbility.getLoginRewardsAmount();
  }

  public String vipType() {
    return nobleVipAbility.getVipType();
  }

}
