components_liveTv_RecordProgramTask.bs

import "pkg:/source/api/ApiClient.bs"
import "pkg:/source/api/apiPool.bs"
import "pkg:/source/roku_modules/log/LogMixin.brs"
import "pkg:/source/utils/misc.bs"

sub init()
  m.log = new log.Logger("RecordProgramTask")
  m.top.functionName = "RecordOrCancelProgram"
end sub

' Orchestrator Task: uses ApiTask pool for GET/POST/DELETE with result feedback.
sub RecordOrCancelProgram()
  if not isValid(m.top.programDetails)
    m.top.result = { ok: false, action: "unknown" }
    return
  end if

  timerId = invalid
  if isValidAndNotEmpty(m.top.programDetails.timerId)
    timerId = m.top.programDetails.timerId
  end if

  if not isValid(timerId)
    ' Creating a recording: GET defaults then POST timer
    res = fetchRes(GetApi().BuildGetLiveTvTimerDefaultsRequest(m.top.programDetails.id), "liveTvTimerDefaults")
    defaults = invalid
    if isValid(res) and res.ok
      defaults = res.json
    end if

    if isValid(defaults)
      if m.top.shouldRecordSeries = true
        createRes = fetchRes(GetApi().BuildCreateSeriesTimerRequest(defaults), "createSeriesTimer")
      else
        createRes = fetchRes(GetApi().BuildCreateTimerRequest(defaults), "createTimer")
      end if
      if isValid(createRes) and createRes.ok
        m.top.programDetails.hdSmallIconUrl = "pkg:/images/red.png"
        ' POST /LiveTv/Timers returns 204 No Content — no timer ID in the response.
        ' Re-fetch the program item to get the server-assigned TimerId so subsequent
        ' presses trigger cancel instead of attempting a duplicate create.
        refreshRes = fetchRes(GetApi().BuildGetItemRequest(m.top.programDetails.id), "refreshProgram")
        if isValid(refreshRes) and refreshRes.ok and isValid(refreshRes.json)
          m.top.programDetails.timerId = refreshRes.json.TimerId ?? ""
          m.top.programDetails.seriesTimerId = refreshRes.json.SeriesTimerId ?? ""
        end if
        m.top.result = { ok: true, action: "record" }
      else
        m.log.error("Failed to create recording timer")
        m.top.result = { ok: false, action: "record" }
      end if
    else
      m.log.error("Could not retrieve live TV Defaults from Server")
      m.top.result = { ok: false, action: "record" }
    end if
  else
    ' Cancelling a recording
    if m.top.shouldRecordSeries = true
      cancelRes = fetchRes(GetApi().BuildCancelSeriesTimerRequest(m.top.programDetails.seriesTimerId), "cancelSeriesTimer")
    else
      cancelRes = fetchRes(GetApi().BuildCancelTimerRequest(timerId), "cancelTimer")
    end if
    if isValid(cancelRes) and cancelRes.ok
      m.top.programDetails.hdSmallIconUrl = invalid
      m.top.programDetails.timerId = ""
      m.top.result = { ok: true, action: "cancel" }
    else
      m.log.error("Failed to cancel recording timer")
      m.top.result = { ok: false, action: "cancel" }
    end if
  end if
end sub