#
#  Plex Extension Framework
#  Copyright (C) 2008-2012 Plex, Inc. (James Clarke, Elan Feingold). All Rights Reserved.
#

import Framework
import mimetypes
import urllib

from base import BaseKit

class ResourceKit(BaseKit):

  _included_policies = [
    Framework.policies.CodePolicy,
  ]
  

  def _init(self):
    self.Hosted = self._core.runtime.hosted_resource_url
    self._publish(self.ExternalPath, name='R')
    self._publish(self.SharedExternalPath, name='S')

    
  def ExternalPath(self, itemname):
    """
      Generates an externally accessible path for the named resource. This method is usually used to
      assign bundled images to object attributes.
      
      .. note:: The alias :func:`R()` is equivalent to this method.
    """
    return self._core.runtime.external_resource_path(itemname, self._sandbox)
  

  def SharedExternalPath(self, itemname):
    """
      Generates an externally accessible path for the named shared resource. A list of valid
      shared resource names is provided below.
      
      .. note:: The alias :func:`S()` is equivalent to this method.
    """
    self._core.log.warn("Resource.SharedExternalPath() (and the 'S' alias) are deprecated. All resource path generation can now be done via Resource.ExternalPath() (and the 'R' alias). Please update your code.")
    return self.ExternalPath(itemname)
  

  def Load(self, itemname, binary=True):
    """
      Loads the named resource file and returns the data as a string.
    """
    return self._core.storage.load_resource(itemname, binary, self._sandbox)
    

  def LoadShared(self, itemname, binary=True):
    """
      Loads the named shared resource file and returns the data as a string.
    """
    self._core.log.warn("Resource.LoadShared() is deprecated. All resource loading can now be done via Resource.Load(). Please update your code.")
    return self.Load(itemname, binary)
    

  def GuessMimeType(self, path):
    """
      Attempts to guess the MIME type of a given path based on its extension.
    """
    return Framework.utils.guess_mime_type(path)
    

  @BaseKit._include_in(Framework.policies.BundlePolicy)
  @BaseKit._exclude_from(Framework.policies.ModernPolicy)
  def AddMimeType(self, mimetype, extension):
    """
      Assigns the specified MIME type to the given extension.
    """
    if extension[0] != '.': extension = '.' + extension
    mimetypes.add_type(mimetype, extension)


  def ContentsOfURLWithFallback(self, url, fallback=None, hosted_fallback=None):
    # Find the handler function.
    func = self._core.runtime.find_handler(Framework.handlers.ResourceRequestHandler).contents_of_url_with_fallback

    # Put single strings inside a list
    if isinstance(url, basestring):
      url = [url]

    # Generate a callback path. Format url lists as a comma-separated string, and include an identifier if this isn't the core sandbox.
    kwargs = {}
    kwargs['urls'] = ','.join([urllib.quote(u) for u in url]) if isinstance(url, list) else None
    
    if fallback != None:
      kwargs['fallback'] = fallback
      if self._sandbox.identifier != self._core.identifier:
        kwargs['identifier'] = urllib.quote(self._sandbox.identifier)
        
    if hosted_fallback != None:
      kwargs['hosted_type'] = hosted_fallback[0]
      kwargs['hosted_group'] = hosted_fallback[1]
      if len(hosted_fallback) > 2:
        kwargs['hosted_identifier'] = hosted_fallback[2]
        
    return self._core.runtime.generate_callback_path(func, **kwargs)
      
