import py
from templess import templess
from lxml import etree
from PIL import Image
from cStringIO import StringIO
import helpers

class _screenshots(object):
    """screenshots page"""

    extensions = ['.gif', '.png', '.jpg']
    def get_images(self, serverroot, siteroot):
        ipath = py.path.svnwc(serverroot) / siteroot / 'screenshots'
        imagedata = []
        for f in ipath.listdir():
            if not f.basename.startswith('_') and f.ext in self.extensions:
                filename = f.basename
                filepath = '%sscreenshots/%s' % (siteroot, filename)
                imagedata.append({
                    'filepath': filepath,
                    'filename': filename,
                    'size': f.size(),
                    'comment': f.propget('shot:comment').strip(),
                    'application': f.propget('shot:application').strip(),
                    'url': f.propget('shot:url').strip(),
                    'thumbsrc': '?image=%s' % (filename,),
                })
        imagedata.sort(lambda a, b: cmp(a['application'], 
                        b['application']))
        return imagedata
    
    def render(self, context):
        if context['form'].has_key('image'):
            return self.render_image(context)
        else:
            return self.render_page(context)

    mimetypes = {
        '.jpg': 'image/jpeg',
        '.png': 'image/png',
        '.gif': 'image/gif',
    }
    imagecache = {}
    def render_image(self, context):
        request = context['request']
        options = request.get_options()
        filename = context['form']['image'].value
        fpath = py.path.local(options['serverroot']) / options['siteroot'] /\
                'screenshots' / filename
        context['headers']['content-type'] = self.mimetypes[fpath.ext]
        if self.imagecache.has_key(str(fpath)):
            mtime, data = self.imagecache[str(fpath)]
            if mtime == fpath.mtime():
                return data
        image = Image.open(str(fpath))
        ts = int(options['thumbsize'])
        image.thumbnail((ts, ts), Image.ANTIALIAS)
        temppath = py.test.ensuretemp('screenshot_thumbnails')
        fp = temppath / filename
        image.save(str(fp))
        data = fp.read()
        self.imagecache[str(fpath)] = (fp.mtime(), data)
        temppath.remove()
        return data

    def render_page(self, context):
        request = context['request']
        options = request.get_options()
        env = {
            'images': self.get_images(options['serverroot'], 
                                        options['siteroot']),
        }
        f = helpers.templatepath(request) / 'screenshots.html'
        t = templess.template(f, options.get('charset', 'UTF-8'))
        return t.render(env).xpath('//body')[0]

screenshots = _screenshots()

