--[[
 * Copyright (C) 2015 Grilo Project
 *
 * This library is free software; you can redistribute it and/or
 * modify it under the terms of the GNU Lesser General Public License
 * as published by the Free Software Foundation; version 2.1 of
 * the License, or (at your option) any later version.
 *
 * This library is distributed in the hope that it will be useful, but
 * WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
 * Lesser General Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public
 * License along with this library; if not, write to the Free Software
 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
 * 02110-1301 USA
 *
--]]

---------------------------
-- Source initialization --
---------------------------

source = {
  id = "grl-appletrailers-lua",
  name = "Apple Movie Trailers",
  description = "Apple Trailers",
  supported_media = 'video',
  supported_keys = { 'author', 'publication-date', 'description', 'duration', 'genre', 'id', 'thumbnail', 'title', 'url', 'certificate', 'studio', 'license', 'performer', 'size' },
  config_keys = {
    optional = { 'definition' },
  },
  icon = 'resource:///org/gnome/grilo/plugins/appletrailers/trailers.svg',
  tags = { 'country:us', 'cinema', 'net:internet', 'net:plaintext' },
}

-- Global table to store config data
ldata = {}

-- Global table to store parse results
cached_xml = nil

function grl_source_init(configs)
  ldata.hd = (configs.definition and configs.definition == 'hd')
  return true
end

---------------------------------
-- Handlers of Grilo functions --
---------------------------------

APPLE_TRAILERS_CURRENT_SD = "http://trailers.apple.com/trailers/home/xml/current_480p.xml"
APPLE_TRAILERS_CURRENT_HD = "http://trailers.apple.com/trailers/home/xml/current_720p.xml"

function grl_source_browse()
  local skip = grl.get_options("skip")
  local count = grl.get_options("count")

  -- Make sure to reset the cache when browsing again
  if skip == 0 then
    cached_xml = nil
  end

  if cached_xml then
    parse_results(cached_xml)
  else
    local url = APPLE_TRAILERS_CURRENT_SD
    if ldata.hd then
      url = APPLE_TRAILERS_CURRENT_HD
    end

    grl.debug('Fetching URL: ' .. url .. ' (count: ' .. count .. ' skip: ' .. skip .. ')')
    grl.fetch(url, fetch_results_cb)
  end
end

---------------
-- Utilities --
---------------

function fetch_results_cb(results)
  if not results then
    grl.warning('Failed to fetch XML file')
    grl.callback()
    return
  end

  cached_xml = grl.lua.xml.string_to_table(results)
  parse_results(cached_xml)
end

function parse_results(results)
  local count = grl.get_options("count")
  local skip = grl.get_options("skip")

  for i, item in pairs(results.records.movieinfo) do
    local media = {}

    media.type = 'video'
    media.id = item.id
    if item.cast then
      media.performer = {}
      for j, cast in pairs(item.cast.name) do
        table.insert(media.performer, cast.xml)
      end
    end
    if item.genre then
      media.genre = {}
      for j, genre in pairs(item.genre.name) do
        table.insert(media.genre, genre.xml)
      end
    end
    media.license = item.info.copyright.xml
    media.description = item.info.description.xml
    media.director = item.info.director.xml
    media.publication_date = item.info.releasedate.xml
    media.certificate = item.info.rating.xml
    media.studio = item.info.studio.xml
    media.title = item.info.title.xml
    media.thumbnail = item.poster.xlarge.xml
    media.url = item.preview.large.xml
    media.size = item.preview.large.filesize
    local mins, secs = item.info.runtime.xml:match('(%d):(%d)')
    media.duration = tonumber(mins) * 60 + tonumber(secs)

    if skip > 0 then
      skip = skip - 1
    else
      count = count - 1
      grl.callback(media, count)
      if count == 0 then
        return
      end
    end
  end

  if count ~= 0 then
    grl.callback()
  end
end
