# -*- coding: utf-8 -*-
from __future__ import absolute_import, division, unicode_literals
from logging import getLogger

from . import common
from .. import plex_functions as PF, backgroundthread, utils

###############################################################################

LOG = getLogger("PLEX." + __name__)

###############################################################################


class GetMetadataTask(backgroundthread.Task, common.libsync_mixin):
    """
    Threaded download of Plex XML metadata for a certain library item.
    Fills the queue with the downloaded etree XML objects

    Input:
        queue               Queue.Queue() object where this thread will store
                            the downloaded metadata XMLs as etree objects
    """
    def setup(self, queue, plex_id, get_children=False):
        self.queue = queue
        self.plex_id = plex_id
        self.get_children = get_children

    def run(self):
        """
        Do the work
        """
        if self.isCanceled():
            return
        # Download Metadata
        xml = PF.GetPlexMetadata(self.plex_id)
        if xml is None:
            # Did not receive a valid XML - skip that item for now
            LOG.error("Could not get metadata for %s. Skipping that item "
                      "for now", self.plex_id)
            continue
        elif xml == 401:
            LOG.error('HTTP 401 returned by PMS. Too much strain? '
                      'Cancelling sync for now')
            utils.window('plex_scancrashed', value='401')
            return
        xml.children = None
        if not self.isCanceled() and self.get_children:
            children_xml = PF.GetAllPlexChildren(self.plex_id)
            try:
                children_xml[0].attrib
            except (TypeError, IndexError, AttributeError):
                LOG.error('Could not get children for Plex id %s',
                          self.plex_id)
            else:
                xml.children = children_xml
        self.queue.put(xml)