components_home_HomeItem.bs

import "pkg:/source/api/baserequest.bs"
import "pkg:/source/api/Image.bs"
import "pkg:/source/roku_modules/log/LogMixin.brs"
import "pkg:/source/utils/config.bs"
import "pkg:/source/utils/misc.bs"

sub init()
  m.log = log.Logger("HomeItem")

  initItemText()
  initItemPoster()
  initItemIcon()
  initItemTextExtra()
  m.itemPoster.observeField("loadStatus", "onPosterLoadStatusChanged")
  initBackdrop()
end sub

sub initItemText()
  m.itemText = m.top.findNode("itemText")
end sub

sub initItemPoster()
  m.itemPoster = m.top.findNode("itemPoster")
end sub

sub initItemTextExtra()
  m.itemTextExtra = m.top.findNode("itemTextExtra")
end sub

sub initBackdrop()
  m.backdrop = m.top.findNode("backdrop")
end sub

sub initItemIcon()
  m.itemIcon = m.top.findNode("itemIcon")
end sub

sub itemContentChanged()
  if isValid(m.itemPoster) then m.itemPoster.callFunc("resetBadge")
  itemData = m.top.itemContent
  if itemData = invalid then return

  itemData.Title = itemData.name ' Temporarily required while we move from "HomeItem" to "JRContentItem"

  ' validate to prevent crash
  userSettings = invalid
  if isValid(m.global) and isValid(m.global.session) and isValid(m.global.session.user) and isValid(m.global.session.user.settings)
    userSettings = m.global.session.user.settings
  end if

  ' validate to prevent crash
  if not isValid(m.itemPoster) then initItemPoster()
  if not isValid(m.itemText) then initItemText()
  if not isValid(m.itemTextExtra) then initItemTextExtra()
  if not isValid(m.backdrop) then initBackdrop()
  if not isValid(m.itemIcon) then initItemIcon()

  m.itemPoster.width = itemData.imageWidth
  m.itemText.maxWidth = itemData.imageWidth
  m.itemTextExtra.width = itemData.imageWidth
  m.itemTextExtra.visible = true
  m.itemTextExtra.text = ""
  m.backdrop.width = itemData.imageWidth


  if isValid(itemData.iconUrl)
    m.itemIcon.uri = itemData.iconUrl
  end if

  if itemData.isWatched
    m.itemPoster.isWatched = true
  else
    if LCase(itemData.type) = "series"
      if isValid(userSettings)
        unwatchedEpisodeCountSetting = userSettings["ui.tvshows.disableUnwatchedEpisodeCount"]
        if isValid(unwatchedEpisodeCountSetting) and not unwatchedEpisodeCountSetting
          if isValid(itemData.json.UserData) and isValid(itemData.json.UserData.UnplayedItemCount)
            m.itemPoster.unplayedCount = itemData.json.UserData.UnplayedItemCount
          end if
        end if
      end if
    end if
  end if

  ' Format the Data based on the type of Home Data
  if itemData.type = "CollectionFolder" or itemData.type = "UserView" or itemData.type = "Channel"
    m.itemPoster.uri = itemData.widePosterURL
    return
  end if

  if itemData.type = "UserView"
    m.itemPoster.width = "96"
    m.itemPoster.height = "96"
    m.itemPoster.translation = "[192, 88]"
    m.itemText.text = itemData.name
    m.itemPoster.uri = itemData.widePosterURL
    return
  end if

  m.itemTextExtra.visible = true

  ' "Program" is from clicking on an "On Now" item on the Home Screen
  if itemData.type = "Program"
    m.itemText.Text = itemData.json.name
    m.itemTextExtra.Text = itemData.json.ChannelName
    if itemData.usePoster
      m.itemPoster.uri = itemData.thumbnailURL
    else
      m.itemPoster.uri = ImageURL(itemData.json.ChannelId)
    end if
    m.itemPoster.loadDisplayMode = "scaleToFill"

    ' Set Episode title if available
    if isValid(itemData.json.EpisodeTitle)
      m.itemTextExtra.text = itemData.json.EpisodeTitle
    end if

    return
  end if

  if itemData.type = "Episode" or LCase(itemData.type) = "recording"
    m.itemText.text = itemData.json.SeriesName

    m.itemPoster.playedPercentage = itemData.PlayedPercentage

    if isValid(userSettings)
      if userSettings["ui.general.episodeimagesnextup"] = "webclient"
        tmpSetting = m.global.session.user.Configuration.useEpisodeImagesInNextUpAndResume
        if isValid(tmpSetting) and tmpSetting
          m.itemPoster.uri = itemData.thumbnailURL
        else
          m.itemPoster.uri = itemData.widePosterURL
        end if
      else if userSettings["ui.general.episodeimagesnextup"] = "show"
        m.itemPoster.uri = itemData.widePosterURL
      else if userSettings["ui.general.episodeimagesnextup"] = "episode"
        m.itemPoster.uri = itemData.thumbnailURL
      end if
    else
      ' use show image if user settings are invalid for some reason
      m.itemPoster.uri = itemData.widePosterURL
    end if

    ' Set Series and Episode Number for Extra Text
    extraPrefix = ""
    if isValid(itemData.json.ParentIndexNumber)
      extraPrefix = "S" + StrI(itemData.json.ParentIndexNumber).trim()
    end if
    if isValid(itemData.json.IndexNumber)
      extraPrefix = extraPrefix + "E" + StrI(itemData.json.IndexNumber).trim()
    end if
    if extraPrefix.len() > 0
      extraPrefix = extraPrefix + " - "
    end if

    m.itemTextExtra.text = extraPrefix + itemData.name
    return
  end if

  if itemData.type = "Movie" or itemData.type = "MusicVideo"
    m.itemText.text = itemData.name

    m.itemPoster.playedPercentage = itemData.PlayedPercentage

    ' Use best image, but fallback to secondary if it's empty
    if (itemData.imageWidth = 180 and itemData.posterURL <> "") or itemData.thumbnailURL = ""
      m.itemPoster.uri = itemData.posterURL
    else
      m.itemPoster.uri = itemData.thumbnailURL
    end if

    ' Set Release Year and Age Rating for Extra Text
    textExtra = ""
    if isValid(itemData.json.ProductionYear)
      textExtra = StrI(itemData.json.ProductionYear).trim()
    end if
    if isValid(itemData.json.OfficialRating)
      if textExtra <> ""
        textExtra = textExtra + " - " + itemData.json.OfficialRating
      else
        textExtra = itemData.json.OfficialRating
      end if
    end if
    m.itemTextExtra.text = textExtra

    return
  end if

  if itemData.type = "Video"
    m.itemText.text = itemData.name

    m.itemPoster.playedPercentage = itemData.PlayedPercentage

    if itemData.imageWidth = 180
      m.itemPoster.uri = itemData.posterURL
    else
      m.itemPoster.uri = itemData.thumbnailURL
    end if

    return
  end if

  if itemData.type = "BoxSet"
    m.itemText.text = itemData.name
    m.itemPoster.uri = itemData.posterURL

    ' Set small text to number of items in the collection
    if isValid(itemData.json) and isValid(itemData.json.ChildCount)
      m.itemTextExtra.text = StrI(itemData.json.ChildCount).trim() + " item"
      if itemData.json.ChildCount > 1
        m.itemTextExtra.text += "s"
      end if
    end if
    return
  end if

  if itemData.type = "Series"

    m.itemText.text = itemData.name

    if itemData.usePoster = true
      if itemData.imageWidth = 180
        m.itemPoster.uri = itemData.posterURL
      else
        m.itemPoster.uri = itemData.widePosterURL
      end if
    else
      m.itemPoster.uri = itemData.thumbnailURL
    end if

    textExtra = ""
    if isValid(itemData.json.ProductionYear)
      textExtra = StrI(itemData.json.ProductionYear).trim()
    end if

    ' Set Years Run for Extra Text
    if itemData.json.Status = "Continuing"
      textExtra = textExtra + " - Present"
    else if itemData.json.Status = "Ended" and isValid(itemData.json.EndDate)
      textExtra = textExtra + " - " + LEFT(itemData.json.EndDate, 4)
    end if
    m.itemTextExtra.text = textExtra

    return
  end if

  if itemData.type = "MusicAlbum"
    m.itemText.text = itemData.name
    m.itemTextExtra.text = itemData.json.AlbumArtist
    m.itemPoster.uri = itemData.posterURL
    return
  end if

  if itemData.type = "MusicArtist"
    m.itemText.text = itemData.name
    m.itemTextExtra.text = itemData.json.AlbumArtist
    m.itemPoster.uri = ImageURL(itemData.id)
    return
  end if

  if itemData.type = "Audio"
    m.itemText.text = itemData.name
    m.itemTextExtra.text = itemData.json.AlbumArtist
    m.itemPoster.uri = ImageURL(itemData.id)
    return
  end if

  if itemData.type = "TvChannel"
    m.itemText.text = itemData.name
    m.itemTextExtra.text = itemData.json.AlbumArtist
    m.itemPoster.uri = ImageURL(itemData.id)
    return
  end if

  if itemData.type = "Season"
    m.itemText.text = itemData.json.SeriesName
    m.itemTextExtra.text = itemData.name
    m.itemPoster.uri = ImageURL(itemData.id)
    return
  end if

  if itemData.type = "Photo"
    m.itemText.text = itemData.name
    m.itemPoster.uri = ImageURL(itemData.id)

    ' subtext
    if isValidAndNotEmpty(itemData.json)
      if isValid(itemData.json.ProductionYear)
        m.itemTextExtra.text = itemData.json.ProductionYear.ToStr().trim()
      end if
      if isValidAndNotEmpty(itemData.json.Album)
        if m.itemTextExtra.text = ""
          m.itemTextExtra.text = tr("Album") + ": " + itemData.json.Album.trim()
        else
          m.itemTextExtra.text = m.itemTextExtra.text + " - " + tr("Album") + ": " + itemData.json.Album.trim()
        end if
      end if
    end if
    return
  end if

  if itemData.type = "PhotoAlbum"
    m.itemText.text = itemData.name
    m.itemPoster.uri = ImageURL(itemData.id)

    ' subtext
    if isValid(itemData.json.ChildCount)
      m.itemTextExtra.text = itemData.json.ChildCount.ToStr().trim() + " items"
    end if

    return
  end if

  m.log.warn("Unhandled Home Item Type", itemData.type)
end sub

' Enable title scrolling based on item Focus
sub focusChanged()
  if m.top.itemHasFocus = true
    m.itemText.repeatCount = -1
  else
    m.itemText.repeatCount = 0
  end if
end sub

'Hide backdrop and icon when poster loaded
sub onPosterLoadStatusChanged()
  if m.itemPoster.loadStatus = "ready" and m.itemPoster.uri <> ""
    m.backdrop.visible = false
    m.itemIcon.visible = false
  else
    m.backdrop.visible = true
    m.itemIcon.visible = true
  end if
end sub