# -*- coding: utf-8

from django.conf import settings
from django.utils.encoding import smart_unicode
from filebrowser.fb_settings import *

from filebrowser.functions import _get_file_type, _url_join, _is_selectable, \
    _get_version_path

from time import gmtime, strftime

import locale
import os
import re
import datetime
import urllib


# filebrowser imports

# PIL import
if STRICT_PIL:
    from PIL import Image
else:
    try:
        from PIL import Image
    except ImportError:
        import Image


def filesystem_encoding(ucode):
    ucode = ucode.encode('utf-8')
    ucode = urllib.quote(ucode)
    return ucode


class FileObject(object):
    """
    The FileObject represents a File on the Server.

    PATH has to be relative to MEDIA_ROOT.
    """

    def __init__(self, path):
        self.path = path
        self.head = os.path.split(path)[0]
        self.filename = os.path.split(path)[1]
        self.filename_lower = self.filename.lower()  # important for sorting
        self.filetype = _get_file_type(self.filename)

    def _filesize(self):
        """
        Filesize.
        """
        if os.path.isfile(os.path.join(MEDIA_ROOT, self.path)) or os.path.isdir(os.path.join(MEDIA_ROOT, self.path)):
            return os.path.getsize(os.path.join(MEDIA_ROOT, self.path))
        return ""
    filesize = property(_filesize)

    def _date(self):
        """
        Date.
        """
        if os.path.isfile(os.path.join(MEDIA_ROOT, self.path)) or os.path.isdir(os.path.join(MEDIA_ROOT, self.path)):
            return os.path.getmtime(os.path.join(MEDIA_ROOT, self.path))
        # IMHO this should raise an exception
        return None
    date = property(_date)

    def _datetime(self):
        """
        Datetime Object.
        """
        return datetime.datetime.fromtimestamp(self.date)
    datetime = property(_datetime)

    def _extension(self):
        """
        Extension.
        """
        return u"%s" % os.path.splitext(self.filename)[1]
    extension = property(_extension)

    def _filetype_checked(self):
        if self.filetype == "Folder" and os.path.isdir(self.path_full):
            return self.filetype
        elif self.filetype != "Folder" and os.path.isfile(self.path_full):
            return self.filetype
        else:
            return ""
    filetype_checked = property(_filetype_checked)

    def _path_full(self):
        """
        Full server PATH including MEDIA_ROOT.
        """
        return u"%s" % os.path.join(MEDIA_ROOT, self.path)
    path_full = property(_path_full)

    def _path_relative(self):
        return self.path
    path_relative = property(_path_relative)

    def _path_relative_directory(self):
        """
        Path relative to initial directory.
        """
        directory_re = re.compile(r'^(%s)' % (DIRECTORY))
        value = directory_re.sub('', self.path)
        return u"%s" % value
    path_relative_directory = property(_path_relative_directory)

    def _url_relative(self):
        return self.path
    url_relative = property(_url_relative)

    def _url_full(self):
        """
        Full URL including MEDIA_URL.
        """
        return filesystem_encoding(u"%s" % _url_join(MEDIA_URL, self.path))

    url_full = property(_url_full)

    def _url_save(self):
        """
        URL used for the filebrowsefield.
        """
        if SAVE_FULL_URL:
            return self.url_full
        else:
            return filesystem_encoding(self.path)
    url_save = property(_url_save)

    def _url_thumbnail(self):
        """
        Thumbnail URL.
        """
        if self.filetype == "Image":
            return filesystem_encoding(u"%s" % _url_join(MEDIA_URL, _get_version_path(self.path, u'fb_thumb')))
        else:
            return ""
    url_thumbnail = property(_url_thumbnail)

    def url_admin(self):
        if self.filetype_checked == "Folder":
            directory_re = re.compile(r'^(%s)' % (DIRECTORY))
            value = directory_re.sub('', self.path)
            return filesystem_encoding(u"%s" % value)
        else:
            return filesystem_encoding(u"%s" % _url_join(MEDIA_URL, self.path))

    def _dimensions(self):
        """
        Image Dimensions.
        """
        if self.filetype == 'Image':
            try:
                im = Image.open(os.path.join(MEDIA_ROOT, self.path))
                return im.size
            except:
                pass
        else:
            return False
    dimensions = property(_dimensions)

    def _width(self):
        """
        Image Width.
        """
        return self.dimensions[0]
    width = property(_width)

    def _height(self):
        """
        Image Height.
        """
        return self.dimensions[1]
    height = property(_height)

    def _orientation(self):
        """
        Image Orientation.
        """
        if self.dimensions:
            if self.dimensions[0] >= self.dimensions[1]:
                return "Landscape"
            else:
                return "Portrait"
        else:
            return None
    orientation = property(_orientation)

    def _is_empty(self):
        """
        True if Folder is empty, False if not.
        """
        if os.path.isdir(self.path_full):
            if not os.listdir(self.path_full):
                return True
            else:
                return False
        else:
            return None
    is_empty = property(_is_empty)

    def __repr__(self):
        return u"%s" % self.url_save

    def __str__(self):
        return u"%s" % self.url_save

    def __unicode__(self):
        return u"%s" % self.url_save
