package com.twitter.home_mixer.model

import com.twitter.escherbird.{thriftscala => esb}
import com.twitter.search.common.features.{thriftscala => sc}
import com.twitter.tweetypie.{thriftscala => tp}

object ContentFeatures {
  val Empty: ContentFeatures = ContentFeatures(
    0.toShort,
    false,
    0.toShort,
    0.toShort,
    None,
    None,
    None,
    None,
    None,
    None,
    None,
    None,
    None,
    None,
    None,
    None,
    None,
    None,
    None,
    None,
    None,
    None,
    None,
    None,
    None,
    None,
    None,
    None,
    None,
    None,
    None,
    None,
    None,
    None,
    None,
    None,
    None,
    None,
    None,
    None,
    None,
    None
  )

  def fromThrift(ebFeatures: sc.ThriftTweetFeatures): ContentFeatures =
    ContentFeatures(
      length = ebFeatures.tweetLength.getOrElse(0).toShort,
      hasQuestion = ebFeatures.hasQuestion.getOrElse(false),
      numCaps = ebFeatures.numCaps.getOrElse(0).toShort,
      numWhiteSpaces = ebFeatures.numWhitespaces.getOrElse(0).toShort,
      numNewlines = ebFeatures.numNewlines,
      videoDurationMs = ebFeatures.videoDurationMs,
      bitRate = ebFeatures.bitRate,
      aspectRatioNum = ebFeatures.aspectRatioNum,
      aspectRatioDen = ebFeatures.aspectRatioDen,
      widths = ebFeatures.widths.map(_.map(_.toShort)),
      heights = ebFeatures.heights.map(_.map(_.toShort)),
      resizeMethods = ebFeatures.resizeMethods.map(_.map(_.toShort)),
      numMediaTags = ebFeatures.numMediaTags.map(_.toShort),
      mediaTagScreenNames = ebFeatures.mediaTagScreenNames,
      emojiTokens = ebFeatures.emojiTokens.map(_.toSet),
      emoticonTokens = ebFeatures.emoticonTokens.map(_.toSet),
      faceAreas = ebFeatures.faceAreas,
      dominantColorRed = ebFeatures.dominantColorRed,
      dominantColorBlue = ebFeatures.dominantColorBlue,
      dominantColorGreen = ebFeatures.dominantColorGreen,
      numColors = ebFeatures.numColors.map(_.toShort),
      stickerIds = ebFeatures.stickerIds,
      mediaOriginProviders = ebFeatures.mediaOriginProviders,
      isManaged = ebFeatures.isManaged,
      is360 = ebFeatures.is360,
      viewCount = ebFeatures.viewCount,
      isMonetizable = ebFeatures.isMonetizable,
      isEmbeddable = ebFeatures.isEmbeddable,
      hasSelectedPreviewImage = ebFeatures.hasSelectedPreviewImage,
      hasTitle = ebFeatures.hasTitle,
      hasDescription = ebFeatures.hasDescription,
      hasVisitSiteCallToAction = ebFeatures.hasVisitSiteCallToAction,
      hasAppInstallCallToAction = ebFeatures.hasAppInstallCallToAction,
      hasWatchNowCallToAction = ebFeatures.hasWatchNowCallToAction,
      dominantColorPercentage = ebFeatures.dominantColorPercentage,
      posUnigrams = ebFeatures.posUnigrams.map(_.toSet),
      posBigrams = ebFeatures.posBigrams.map(_.toSet),
      semanticCoreAnnotations = ebFeatures.semanticCoreAnnotations,
      tokens = ebFeatures.textTokens.map(_.toSeq),
      conversationControl = ebFeatures.conversationControl,
      // media and selfThreadMetadata not carried by ThriftTweetFeatures
      media = None,
      selfThreadMetadata = None
    )
}

case class ContentFeatures(
  length: Short,
  hasQuestion: Boolean,
  numCaps: Short,
  numWhiteSpaces: Short,
  numNewlines: Option[Short],
  videoDurationMs: Option[Int],
  bitRate: Option[Int],
  aspectRatioNum: Option[Short],
  aspectRatioDen: Option[Short],
  widths: Option[Seq[Short]],
  heights: Option[Seq[Short]],
  resizeMethods: Option[Seq[Short]],
  numMediaTags: Option[Short],
  mediaTagScreenNames: Option[Seq[String]],
  emojiTokens: Option[Set[String]],
  emoticonTokens: Option[Set[String]],
  faceAreas: Option[Seq[Int]],
  dominantColorRed: Option[Short],
  dominantColorBlue: Option[Short],
  dominantColorGreen: Option[Short],
  numColors: Option[Short],
  stickerIds: Option[Seq[Long]],
  mediaOriginProviders: Option[Seq[String]],
  isManaged: Option[Boolean],
  is360: Option[Boolean],
  viewCount: Option[Long],
  isMonetizable: Option[Boolean],
  isEmbeddable: Option[Boolean],
  hasSelectedPreviewImage: Option[Boolean],
  hasTitle: Option[Boolean],
  hasDescription: Option[Boolean],
  hasVisitSiteCallToAction: Option[Boolean],
  hasAppInstallCallToAction: Option[Boolean],
  hasWatchNowCallToAction: Option[Boolean],
  media: Option[Seq[tp.MediaEntity]],
  dominantColorPercentage: Option[Double],
  posUnigrams: Option[Set[String]],
  posBigrams: Option[Set[String]],
  semanticCoreAnnotations: Option[Seq[esb.TweetEntityAnnotation]],
  selfThreadMetadata: Option[tp.SelfThreadMetadata],
  tokens: Option[Seq[String]],
  conversationControl: Option[tp.ConversationControl],
)
