#! /usr/bin/env python
# -*- coding: utf-8 -*-

import os
import glob
import re
import sys
import subprocess
import tempfile

import xml.etree.ElementTree as ET
import re
from PIL import Image
from PIL import PngImagePlugin

from distutils.cmd import Command
from setuptools.command.install_lib import install_lib as _install_lib
from distutils.command.build import build as _build
from distutils.command.sdist import sdist
from setuptools import setup, find_packages

class eo_sdist(sdist):

    def run(self):
        print "creating VERSION file"
        if os.path.exists('VERSION'):
            os.remove('VERSION')
        version = get_version()
        version_file = open('VERSION', 'w')
        version_file.write(version)
        version_file.close()
        sdist.run(self)
        print "removing VERSION file"
        if os.path.exists('VERSION'):
            os.remove('VERSION')

def get_version():
    '''Use the VERSION, if absent generates a version with git describe, if not
       tag exists, take 0.0.0- and add the length of the commit log.
    '''
    if os.path.exists('VERSION'):
        with open('VERSION', 'r') as v:
            return v.read()
    if os.path.exists('.git'):
        p = subprocess.Popen(['git','describe','--dirty','--match=v*'],
                stdout=subprocess.PIPE, stderr=subprocess.PIPE)
        result = p.communicate()[0]
        if p.returncode == 0:
            return result.split()[0][1:].replace('-', '.')
        else:
            return '0.0.0-%s' % len(
                    subprocess.check_output(
                            ['git', 'rev-list', 'HEAD']).splitlines())
    return '0.0.0'


class compile_translations(Command):
    description = 'compile message catalogs to MO files via django compilemessages'
    user_options = []

    def initialize_options(self):
        pass

    def finalize_options(self):
        pass

    def run(self):
        try:
            from django.core.management import call_command
            for path, dirs, files in os.walk('gadjo'):
                if 'locale' not in dirs:
                    continue
                curdir = os.getcwd()
                os.chdir(os.path.realpath(path))
                call_command('compilemessages')
                os.chdir(curdir)
        except ImportError:
            sys.stderr.write('!!! Please install Django >= 1.4 to build translations\n')


class build_icons(Command):
    description = 'build icons'
    user_options = []

    def initialize_options(self):
        pass

    def finalize_options(self):
        pass

    def run(self):
        destpath = 'gadjo/static/css/icons/'
        if not os.path.exists(destpath):
            os.mkdir(destpath)
        variants = {
            'small': {'colour': 'e7e7e7', 'width': '20',
                'css': 'ul#sidepage-menu li a.icon-%(name)s { background-image: url(icons/%(filename)s); }'},
            'large': {'colour': 'e7e7e7', 'width': '80',
                'css': 'ul.apps li.icon-%(name)s a { background-image: url(icons/%(filename)s); }'},
            'large-hover': {'colour': 'bebebe', 'width': '80',
                'css': 'ul.apps li.icon-%(name)s a:hover { background-image: url(icons/%(filename)s); }'},
        }
        css_rules = []
        for basepath, dirnames, filenames in os.walk('icons'):
            for filename in filenames:
                basename = os.path.splitext(filename)[0]
                for variant in variants:
                    dest_filename = '%s.%s.png' % (basename, variant)
                    destname = os.path.join(destpath, dest_filename)
                    self.generate(os.path.join(basepath, filename), destname,
                            **variants.get(variant))
                    css = variants.get(variant).get('css')
                    if css:
                        css_rules.append(css % {'name': basename, 'filename': dest_filename})
        #print '\n'.join(sorted(css_rules))

    def generate(self, src, dest, colour, width, **kwargs):
        # default values
        author = 'GNOME Project'
        license = 'Creative Commons Attribution-Share Alike 3.0'

        tree = ET.fromstring(open(src).read().replace('#000000', '#%s' % colour))
        for elem in tree.findall('*'):
            if not elem.attrib.get('style'):
                elem.attrib['style'] = 'fill:#%s' % colour
        for elem in tree.getchildren():
            if elem.tag == '{http://www.w3.org/2000/svg}text' and elem.text.startswith('Created by'):
                author = elem.text[len('Created by')+1:]
                tree.remove(elem)
        for elem in tree.getchildren():
            if elem.tag == '{http://www.w3.org/2000/svg}text' and 'Noun Project' in elem.text:
                tree.remove(elem)
        f = tempfile.NamedTemporaryFile(suffix='.svg', delete=False)
        f.write(ET.tostring(tree))
        f.close()

        subprocess.call(['inkscape', '--without-gui',
            '--file', f.name,
            '--export-area-drawing',
            '--export-area-snap',
            '--export-png', dest,
            '--export-width', width])

        # write down licensing info in the png file
        meta = PngImagePlugin.PngInfo()
        meta.add_text('Licence', license, 0)
        png_file = Image.open(dest)
        png_file.save(dest, 'PNG', pnginfo=meta)


class build(_build):
    sub_commands = [('compile_translations', None),
                    ('build_icons', None)] + _build.sub_commands


class install_lib(_install_lib):
    def run(self):
        self.run_command('compile_translations')
        _install_lib.run(self)

setup(
    name='gadjo',
    version=get_version(),
    description='Django base template tailored for management interfaces',
    long_description=open(os.path.join(os.path.dirname(__file__), 'README.txt')).read(),
    author='Frederic Peters',
    author_email='fpeters@entrouvert.com',
    packages=find_packages(),
    include_package_data=True,
    install_requires=[
        'XStatic',
        'XStatic_Font_Awesome',
        'XStatic_jQuery',
        'XStatic_jquery_ui',
        ],
    classifiers=[
        'Development Status :: 4 - Beta',
        'Environment :: Web Environment',
        'Framework :: Django',
        'Intended Audience :: Developers',
        'License :: OSI Approved :: GNU Affero General Public License v3 or later (AGPLv3+)',
        'Operating System :: OS Independent',
        'Programming Language :: Python',
        'Programming Language :: Python :: 2',
    ],
    zip_safe=False,
    cmdclass={
        'build': build,
        'build_icons': build_icons,
        'compile_translations': compile_translations,
        'install_lib': install_lib,
        'sdist': eo_sdist
    },
)
