package tv.pluto.mongo.entities.episodes;

import com.google.gson.annotations.JsonAdapter;
import java.time.LocalDateTime;
import java.util.Collections;
import java.util.Date;
import java.util.List;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.bson.BsonType;
import org.bson.codecs.pojo.annotations.BsonRepresentation;
import org.bson.types.ObjectId;
import tv.pluto.mongo.entities.common.AvailabilityWindows;
import tv.pluto.mongo.entities.common.DistributeAs;
import tv.pluto.mongo.entities.common.Image;
import tv.pluto.mongo.entities.common.Season;
import tv.pluto.mongo.utils.json.DateAdapter;
import tv.pluto.mongo.utils.json.LocalDateTimeAdapter;
import tv.pluto.mongo.utils.json.ObjectIdsAdapter;

@Data
@NoArgsConstructor
@AllArgsConstructor
public class Series {
  @BsonRepresentation(BsonType.OBJECT_ID)
  private String id;

  @JsonAdapter(LocalDateTimeAdapter.class)
  private LocalDateTime updatedAt;

  @JsonAdapter(DateAdapter.class)
  private Date createdAt;

  private String name = "";
  private Boolean published;
  private String displayName = "";
  private String slug = "";
  List<Season> seasons = Collections.emptyList();

  @JsonAdapter(ObjectIdsAdapter.class)
  private List<ObjectId> channels = Collections.emptyList();

  private String type = "";
  private String category = "";
  private String subCategory = "";
  private String genre = "";
  private String subGenre = "";
  private List<String> tags = Collections.emptyList();
  private String summary = "";
  private String description = "";
  private String notes = "";
  private Image thumbnail = new Image();
  private Image featuredImage = new Image();
  private Image partnerLogo = new Image();
  private Image poster = new Image();
  private Image tile = new Image();
  private Integer episodeCount;
  private Integer seasonCount;
  private Boolean userGenerated;
  private DistributeAs distributeAs = new DistributeAs();

  @JsonAdapter(ObjectIdsAdapter.class)
  private List<ObjectId> vodCategoryEntries = Collections.emptyList();

  private Boolean plutoTvOO;
  private String tmsid = "";
  private String activeRegion = "";
  private String metadataLanguage = "";
  private List<String> regionFilter = Collections.emptyList();
  private String rating = "";
  private AvailabilityWindows availabilityWindows = new AvailabilityWindows();

  @JsonAdapter(DateAdapter.class)
  private Date availableDate;

  @JsonAdapter(DateAdapter.class)
  private Date expirationDate;

  private Boolean expirationSetManually;
  private String contentUUID = "";
  private List<String> seoAliases = Collections.emptyList();

  public String getName() {
    return name == null ? "" : name;
  }

  public String getDisplayName() {
    return displayName == null ? "" : displayName;
  }

  public String getSlug() {
    return slug == null ? "" : slug;
  }

  public String getType() {
    return type == null ? "" : type;
  }

  public String getCategory() {
    return category == null ? "" : category;
  }

  public String getSubCategory() {
    return subCategory == null ? "" : subCategory;
  }

  public String getGenre() {
    return genre == null ? "" : genre;
  }

  public String getSubGenre() {
    return subGenre == null ? "" : subGenre;
  }

  public String getSummary() {
    return summary == null ? "" : summary;
  }

  public String getDescription() {
    return description == null ? "" : description;
  }

  public String getNotes() {
    return notes == null ? "" : notes;
  }

  public String getTmsid() {
    return tmsid == null ? "" : tmsid;
  }

  public String getActiveRegion() {
    return activeRegion == null ? "" : activeRegion;
  }

  public String getMetadataLanguage() {
    return metadataLanguage == null ? "" : metadataLanguage;
  }

  public String getRating() {
    return rating == null ? "" : rating;
  }

  public String getContentUUID() {
    return contentUUID == null ? "" : contentUUID;
  }

  public Boolean getPublished() {
    return published != null && published;
  }

  public Boolean getUserGenerated() {
    return userGenerated != null && userGenerated;
  }

  public Boolean getPlutoTvOO() {
    return plutoTvOO != null && plutoTvOO;
  }

  public Boolean getExpirationSetManually() {
    return expirationSetManually != null && expirationSetManually;
  }

  public Integer getEpisodeCount() {
    return episodeCount == null ? 0 : episodeCount;
  }

  public Integer getSeasonCount() {
    return seasonCount == null ? 0 : seasonCount;
  }
}
