from distutils.core import setup
from distutils.command.install import install as _install
from distutils import log
from stat import ST_ATIME, ST_MTIME, S_IMODE, ST_MODE
import os, glob, sys

class install(_install):
    description = """Install and set constants"""

    user_options = _install.user_options
    user_options.extend([('dict-dir=', None, 'dictionaries directory'),
                         ('root-dest=', None, 'destination root')])

    def initialize_options(self):
        self.root = None
        self.root_dest = None
        self.install_data = None
        self.dict_dir = ''
        _install.initialize_options(self)

    def finalize_options(self):
        _install.finalize_options(self)

    def run (self):
        _install.run(self)

        # Rewrite with constants if needed
        for f in self.get_outputs():
            script = file(f)
            l = script.readline()
            script.close()

            # If is python script
            if (l[:2] == '#!') and l.lower().find('python'):
                script = file(f)
                content = script.read()
                script.close()
                const_begin = content.find('### CONSTANTS BEGIN ###')
                const_end   = content.find('#### CONSTANTS END ####')

                # If needs constants
                if (const_begin != -1) and (const_end != -1):
                    log.info("set constants of %s" % f)

                    at = os.stat(f) # Store attributes

                    consts = [['DATADIR', self.install_data],
                              ['DICTDIR', self.dict_dir],
                              ['LIBDIR',  self.install_lib]]

                    script = file(f, 'w')
                    script.write(content[:const_begin] + \
                                 "### CONSTANTS BEGIN ###")
                    for const in consts:
                        if self.root_dest:
                            const[1] = const[1].replace(self.root, '')
                            if const[1][0] == '/':
                                const[1] = const[1][1:]
                            const[1] = os.path.join(self.root_dest, const[1])
                        elif not os.path.isabs(const[1]):
                            const[1] = os.path.abspath(const[1])
                        script.write("\n%s = '%s'" % (const[0], const[1]))
                    script.write("\n" + content[const_end:])
                    script.close()

                    # Restore attributes
                    os.utime(f, (at[ST_ATIME], at[ST_MTIME]))
                    os.chmod(f, S_IMODE(at[ST_MODE]))

                    # Remove extension
                    if f[-3:].lower() == '.py':
                        f_mv = f[:-3]
                        log.info("renaming %s -> %s" % (f, f_mv))
                        os.rename(f, f_mv)

packages = ['liliboggie', 'liliboggie.lang']

for lang in glob.glob(os.path.join(
    'src', 'liliboggie', 'lang', '??')):
    l = lang[-2:]
    print "Found language module: " + l
    packages.append('liliboggie.lang.' + l)

data_files = [(os.path.join('liliboggie', 'anim'),
               glob.glob(os.path.join('data', 'anim', '*'))),
              (os.path.join('liliboggie', 'alphabet'),
               glob.glob(os.path.join('data', 'alphabet', '*'))),
              (os.path.join('liliboggie', 'glade'),
               [os.path.join('data', 'glade', 'glade.glade')]),
              ('liliboggie', [os.path.join('data', 'liliboggie.png')]),
              ('liliboggie', [os.path.join('data', 'icon.png')]),
              ('liliboggie', [os.path.join('data', 'pause.svg')]),
              ('liliboggie', [os.path.join('data', 'gaim_send.wav')])]

for lang in glob.glob(os.path.join('data', 'locale', '??')):
    data_files.append((os.path.join('locale', lang[-2:], 'LC_MESSAGES'), \
                       [os.path.join(lang, 'LC_MESSAGES', 'liliboggie.mo')]))

setup(name='liliboggie',
      package_dir  = {'': 'src'},
      packages = packages,
      cmdclass={'install': install},
      data_files = data_files,
      scripts=[os.path.join('src', 'liliboggie.py')]
      )

