#! /usr/bin/env python
# encoding: utf-8

import Task
from TaskGen import feature, taskgen
import os

deps = {
    'cfg': {
        'gconf': {
            'uselib': 'GCONF',
            'packages': 'gconf-2.0',
            'packages_private': 'config-notify-delegate',
        },
        'keyfile': {
            'packages_private': 'config-notify-delegate',
        },
        'memory': {
            'packages_private': 'config-notify-delegate',
        }
    },
    'vfs': {
        'gio': {
            'uselib': 'GIO',
            'packages': 'gio-2.0',
        },
        'thunar-vfs': {
            'uselib': 'THUNAR_VFS DBUS_GLIB',
            'packages': 'thunar-vfs-1 dbus-glib-1',
        },
        'gnome-vfs': {
            'uselib': 'GNOME_VFS',
            'packages': 'gnome-vfs-2.0',
        }
    },
    'fdo': {
        'gio': {
            'uselib': 'GIO_UNIX',
            'packages': 'gio-unix-2.0',
        },
        'gnome': {
            'uselib': 'GNOME_DESKTOP',
            'packages': 'gnome-desktop-2.0',
        }
    }
}


@taskgen
@feature('cc')
def generate_typelib(self):
    if hasattr(self, 'gir'):
        node = self.path.find_resource('%s.gir' % self.gir)
        if not node:
            print "Not a valid GIR file!"
            return
        task = self.create_task('typelib')
        bld = task.generator.bld
        task.set_inputs(node)
        target = '%s.typelib' % self.gir
        tnode = node.parent.find_or_declare(target)
        task.set_outputs(tnode)
        dirname = os.path.join(bld.bdir, tnode.bld_dir(task.env))
        task.generator.env['CURRENT_BUILD_DIR'] = dirname
        bld.install_files('${LIBDIR}/girepository-1.0',
                          tnode.abspath(task.env), task.env)


def create_typelib_task():
    rule = 'LD_LIBRARY_PATH="${CURRENT_BUILD_DIR}" ${G_IR_COMPILER} ' + \
           '-o ${TGT} ${SRC}'
    Task.simple_task_type('typelib', rule, after='cc_link')

create_typelib_task()


def task_module(type_name, src_prefix):
    def build_module(bld, name):
        module = bld.new_task_gen('cc', 'shlib')
        module.source = ' '.join(['%s-%s.vala' % (prefix, name)
                                  for prefix in src_prefix.split()])
        if type_name in deps and name in deps[type_name]:
            module.uselib = deps[type_name][name].get('uselib', '')
            module.packages = deps[type_name][name].get('packages', '')
            module.packages_private = deps[type_name][name] \
                                      .get('packages_private', '')
        ftype, sep, tail = type_name.partition('-')
        module.uselib_local = 'desktop-agnostic-%s' % ftype
        module.target = 'da-%s-%s' % (type_name, name)
        module.vapi_dirs = '../vapi'
        module.includes = '..'
        module.install_path = None
        bld.install_files('${LIBDIR}/desktop-agnostic/modules',
                          bld.env['shlib_PATTERN'] % module.target)
    return build_module


def set_options(opt):
    opt.add_option('--config-backends', type='string',
                   help='Determines which configuration backend(s) will be ' \
                        'built.',
                   dest='config_backends', default='')
    opt.add_option('--vfs-backends', type='string',
                   help='Determines which VFS backend(s) will be built.',
                   dest='vfs_backends', default='')
    opt.add_option('--desktop-entry-backends', type='string',
                   help='Determines which desktop entry backend(s) will be ' \
                        'built.',
                   dest='de_backends', default='')


def build(bld):
    lib = bld.new_task_gen('cc', 'shlib')
    lib.source = ' '.join([
        'color.vala',
        'module.vala',
        ])
    lib.packages = 'gdk-2.0 gmodule-2.0'
    lib.target = 'desktop-agnostic'
    if bld.env['INTROSPECTION']:
        lib.gir = 'DesktopAgnostic-1.0'
    lib.uselib = 'M GDK GMODULE'
    lib.packages_private = 'build'
    lib.includes = '..'
    lib.vapi_dirs = '../vapi'
    lib.vnum = bld.env['VNUM']

    vfs = bld.new_task_gen('cc', 'shlib')
    vfs.source = ' '.join([
        'vfs.vala',
        'vfs-bookmarks-gtk.vala',
        'vfs-file.vala',
        'vfs-file-monitor.vala',
        'vfs-glob.vala',
        'vfs-trash.vala',
        'vfs-volume.vala',
        ])
    vfs.packages = 'desktop-agnostic posix'
    vfs.target = 'desktop-agnostic-vfs'
    vfs.header = 'vfs'
    if bld.env['INTROSPECTION']:
        vfs.gir = 'DesktopAgnosticVFS-1.0'
    vfs.uselib_local = 'desktop-agnostic'
    vfs.packages_private = 'posix-glob'
    vfs.includes = '..'
    vfs.vapi_dirs = '../vapi .'
    vfs.vnum = bld.env['VNUM']

    cfg = bld.new_task_gen('cc', 'shlib')
    cfg.source = ' '.join([
        'config.vala',
        'config-bridge.vala',
        'config-client.vala',
        'config-schema.vala',
        'config-schema-option.vala',
        'config-schema-type.vala',
        ])
    cfg.packages = 'desktop-agnostic-vfs'
    cfg.target = 'desktop-agnostic-cfg'
    cfg.header = 'config'
    if bld.env['INTROSPECTION']:
        cfg.gir = 'DesktopAgnosticConfig-1.0'
    cfg.uselib_local = 'desktop-agnostic-vfs'
    cfg.packages_private = 'hashtable-gtype-key'
    cfg.includes = '..'
    cfg.vapi_dirs = '../vapi .'
    cfg.vnum = bld.env['VNUM']

    fdo = bld.new_task_gen('cc', 'shlib')
    fdo.source = ' '.join([
        'desktop-entry.vala',
        ])
    fdo.packages = 'desktop-agnostic-vfs'
    fdo.target = 'desktop-agnostic-fdo'
    fdo.header = 'fdo'
    if bld.env['INTROSPECTION']:
        fdo.gir = 'DesktopAgnosticFDO-1.0'
    fdo.uselib_local = 'desktop-agnostic-vfs'
    fdo.vapi_dirs = '.'
    fdo.includes = '..'
    fdo.vnum = bld.env['VNUM']

    ui = bld.new_task_gen('cc', 'shlib')
    ui.source = ' '.join([
        'ui-color-button.vala',
        'ui-icon-button.vala',
        'ui-icon-chooser-dialog.vala',
        'ui-launcher-editor-dialog.vala',
        ])
    ui.packages = 'desktop-agnostic-fdo gtk+-2.0'
    ui.packages_private = 'build'
    ui.target = 'desktop-agnostic-ui'
    ui.header = 'ui'
    if bld.env['INTROSPECTION']:
        ui.gir = 'DesktopAgnosticUI-1.0'
    ui.uselib = 'GTK'
    ui.uselib_local = 'desktop-agnostic-fdo'
    ui.vapi_dirs = '. ../vapi'
    ui.includes = '..'
    ui.vnum = bld.env['VNUM']

    [task_module('cfg', 'config-impl')(bld, name)
     for name in bld.env['BACKENDS_CFG']]
    [task_module('cfg-type', 'config-type')(bld, name)
     for name in ['color']]
    vfs_types = ['vfs-impl', 'vfs-file-impl', 'vfs-file-monitor-impl',
                 'vfs-trash-impl', 'vfs-volume-impl']
    [task_module('vfs', ' '.join(vfs_types))(bld, name)
     for name in bld.env['BACKENDS_VFS']]
    [task_module('fdo', 'desktop-entry-impl')(bld, name)
     for name in bld.env['BACKENDS_DE']]

    mod_guess = bld.new_task_gen('cc', 'shlib')
    mod_guess.source = 'module-guesser.vala'
    mod_guess.uselib_local = 'desktop-agnostic-vfs'
    mod_guess.target = 'da-module-guesser'
    mod_guess.vapi_dirs = '../vapi'
    mod_guess.includes = '..'
    mod_guess.install_path = None
    bld.install_files('${LIBDIR}/desktop-agnostic/modules',
                      bld.env['shlib_PATTERN'] % mod_guess.target)
