import os
import SCons.Tool.textfile

sources = ['src/debug.cpp',
           'src/engine.cpp',
           'src/ibus_portable.cpp',
           'src/imi_ibus_win.cpp',
           'src/main.cpp',
           'src/sunpinyin_config.cpp',
           'src/sunpinyin_engine.cpp',
           'src/sunpinyin_engine_proxy.cpp',
           'src/sunpinyin_lookup_table.cpp',
           'src/sunpinyin_property.cpp']

locales = ['zh_CN']

prefix = '/usr/local'
rpath = ''
cflags = '-O2 -pipe'
version = '2.0.2'

AddOption('--prefix', dest='prefix', type='string', nargs=1, action='store',
          metavar='DIR', help='installation prefix')
AddOption('--rpath', dest='rpath', type='string', nargs=1, action='store',
          metavar='DIR', help='encode rpath in the executables')

if GetOption('prefix') is not None:
    prefix = GetOption('prefix')
if GetOption('rpath') is not None:
    rpath = GetOption('rpath')

data_dir = prefix + '/share/ibus-sunpinyin'
icons_dir = prefix + '/share/ibus-sunpinyin/icons'
bin_dir = prefix + '/lib/ibus-sunpinyin'
gettext_package = 'ibus-sunpinyin'

cflags += ' -DIBUS_SUNPINYIN_LOCALEDIR=\'"%s"\'' % os.path.join(prefix, '/share/locale')
cflags += ' -DIBUS_SUNPINYIN_ICON_DIR=\'"%s"\'' % icons_dir
cflags += ' -DLIBEXECDIR=\'"%s"\'' % bin_dir
cflags += ' -DGETTEXT_PACKAGE=\'"%s"\'' % gettext_package

env = Environment(ENV=os.environ,
                  CFLAGS=cflags, CXXFLAGS=cflags, 
                  CPPPATH=['.'], PREFIX=prefix, SUBSTFILESUFFIX='.in')

if rpath != '':
    env.Append(LINKFLAGS='-Wl,-R -Wl,%s' % rpath)

if 'CC' in os.environ:
    print 'Warning: you\'ve set %s as C compiler' % os.environ['CC']
    env['CC']=os.environ['CC']
    
if 'CXX' in os.environ:
    print 'Warning: you\'ve set %s as C++ compiler' % os.environ['CXX']
    env['CXX']=os.environ['CXX']

#
#==============================configure================================
#
def CheckPKGConfig(context, version='0.12.0'):
    context.Message( 'Checking for pkg-config... ' )
    ret = context.TryAction('pkg-config --atleast-pkgconfig-version=%s' % version)[0]
    context.Result(ret)
    return ret

def CheckPKG(context, name):
    context.Message( 'Checking for %s... ' % name )
    ret = context.TryAction('pkg-config --exists \'%s\'' % name)[0]
    context.Result(ret)
    return ret

conf = Configure(env, custom_tests={'CheckPKGConfig' : CheckPKGConfig,
                                    'CheckPKG' : CheckPKG })

def DoConfigure():
    if GetOption('clean'):
        return

    if not conf.CheckPKGConfig():
        Exit(1)

    if not conf.CheckPKG('ibus-1.0'):
        Exit(1)

    if not conf.CheckPKG('sunpinyin-2.0'):
        Exit(1)
    env = conf.Finish()
    env.ParseConfig('pkg-config ibus-1.0 sunpinyin-2.0 --libs --cflags')

DoConfigure()

env.Program('ibus-engine-sunpinyin', source=sources)
for locale in locales:
    mo = 'po/%s.mo' % (locale,)
    env.Command(mo, [], 'msgfmt po/%s.po -o %s' % (locale, mo))

# bug of scons...
# it doesn't include textfile builders by default?
SCons.Tool.textfile.generate(env)
sub = {'@LIBEXEC_DIR@': prefix + '/lib/ibus-sunpinyin/',
       '@DATA_DIR@' : data_dir,
       '@ICON_DIR@': icons_dir,
       '@VERSION@' : version,
       '@INSTALL_PREFIX@': prefix}
env.Substfile('data/sunpinyin.xml.in', SUBST_DICT=sub)
env.Substfile('setup/config.py.in', SUBST_DICT=sub)
env.Substfile('setup/ibus-setup-sunpinyin.in', SUBST_DICT=sub)

#
#==============================install================================
#
def DoInstall():
    libexec_target = env.Install(bin_dir, ['ibus-engine-sunpinyin', 
                                           'setup/ibus-setup-sunpinyin'])
    for exec_bin in libexec_target:
        env.AddPostAction(exec_bin, Chmod(str(exec_bin), 0755))
        
    setup_target = env.Install(data_dir + '/setup',
                               ['setup/setup.glade',
                                'setup/main.py',
                                'setup/config.py'])
    icons_target = env.Install(icons_dir,
                               ['icons/cnpunc.svg',
                                'icons/eng.svg',
                                'icons/enpunc.svg',
                                'icons/fullwidth.svg',
                                'icons/halfwidth.svg',
                                'icons/han.svg',
                                'icons/setup.svg',
                                'icons/sunpinyin-logo.png'])
    component_target = env.Install(prefix + '/share/ibus/component',
                                   'data/sunpinyin.xml')
    locale_targets = []
    for locale in locales:
        path = prefix + '/share/locale/%s/LC_MESSAGES/%s.mo' % \
            (locale, gettext_package)
        locale_targets.append(env.InstallAs(path, 'po/%s.mo' % (locale,)))

    env.Alias('install-libexec', [libexec_target, setup_target])
    env.Alias('install-data', [icons_target, component_target])
    env.Alias('install-locale', locale_targets)

DoInstall()
env.Alias('install', ['install-libexec', 'install-data', 'install-locale'])
