#-------------#
# Import Vars #
#-------------#
import os
import os.path
import glob
import re

Import('*')

#
# internationalization
#
 
# po_helper
#
# this is not a builder. we can't list the .po files as a target,
# because then scons -c will remove them (even Precious doesn't alter
# this). this function is called whenever a .mo file is being
# built, and will conditionally update the .po file if necessary.
#
 
def po_helper(po,pot):
    args = [ 'msgmerge',
             '--update',
             po,
             pot,
             ]
    print 'Updating ' + po
    return os.spawnvp (os.P_WAIT, 'msgmerge', args)
 
# mo_builder: builder function for (binary) message catalogs (.mo)
#
# first source:  .po file
# second source: .pot file
#
 
def mo_builder(target,source,env):
    #po_helper (source[0].get_path(), source[1].get_path()) 
    # do not update, you should do it manually, causes problems with SVN
    args = [ 'msgfmt',
             '-c',
             '-o',
             target[0].get_path(),
             source[0].get_path()
             ]
    return os.spawnvp (os.P_WAIT, 'msgfmt', args)

mo_bld = Builder (action = mo_builder)
env.Append(BUILDERS = {'MoBuild' : mo_bld})

# options_to_cppfile_builder: builder function for message templates extraction
#
# source: list of C/C++ etc. files to extract messages from
#
def options_to_cppfile_builder (target, source, env): 
    opts_strings = []
    for a in source:
        f = file (a.get_path ())
        for line in f:
            if line[0:7] == 'desc = ':
                line = line.strip ('\n')
                opts_strings.append(line[7:])
            if line[0:8] == 'title = ':
                line = line.strip ('\n')
                opts_strings.append(line[8:])
            if line[0:3] == 'opt':
                    line = line.strip ('\n')
                    opts_strings.append(line[8:])
    
    
    t = file (target[0].get_path (), 'w')
    t.write ('int main () { \n')
    for string in opts_strings[:]:
            t.write ('_("' + string + '")\n')
    
    t.write ('}\n')
    t.close ()
    
options_to_cppfile_bld = Builder (action = options_to_cppfile_builder)
env.Append(BUILDERS = {'OptionsCppFileBuild' : options_to_cppfile_bld})

# guilists_to_cppfile_builder: builder function for message templates extraction
#
# source: list of C/C++ etc. files to extract messages from
#
def guilists_to_cppfile_builder (target, source, env):    
    strings = []
    for a in source:
         f = file (a.get_path ())
         for line in f:
                  if line[0:6] == 'tip = ':
                      line = line.strip ('\n')
                      strings.append(line[6:])
                  if line[0:7] == 'text = ':
                      line = line.strip ('\n')
                      strings.append(line[7:])
    

    
    print target
    t = file (target[0].get_path (), 'w')
    t.write ('int main () { \n')
    for string in strings[:]:
            t.write ('_("' + string + '")\n')
    
    t.write ('_("On"); _("Off")\n')
    t.write ('}\n')
    t.close ()
    
guilists_to_cppfile_bld = Builder (action = guilists_to_cppfile_builder)
env.Append(BUILDERS = {'GuiListsCppFileBuild' : guilists_to_cppfile_bld})


# pot_builder: builder function for message templates (.pot)
#
# source: list of C/C++ etc. files to extract messages from
#

def pot_builder(target,source,env):
    args = [ 'xgettext', 
             '--keyword=_',
             '--keyword=N_',
             '--keyword=_c',
             '--from-code=UTF-8',
             '-o', target[0].get_path(), 
             "--default-domain=" + env['PACKAGE'],]
    args += [ src.get_path() for src in source ]
    

    return os.spawnvp (os.P_WAIT, 'xgettext', args)

pot_bld = Builder (action = pot_builder)
env.Append(BUILDERS = {'PotBuild' : pot_bld})


#---------------------------------#
# utility function, not a builder #
#---------------------------------#

def i18n (buildenv, sources, installenv):
    domain = buildenv['PACKAGE']
    potfile = buildenv['POTFILE']

    installenv.Alias ('potupdate', buildenv.GuiListsCppFileBuild ('guilists.cpp', sources[1]))
    installenv.Alias ('potupdate', buildenv.OptionsCppFileBuild ('optionslist.cpp', sources[2]))
    installenv.Alias ('potupdate', buildenv.PotBuild (potfile, sources[0]))
 
    p_oze = [ os.path.basename (po) for po in glob.glob ('*.po') ]
    languages = [ po.replace ('.po', '') for po in p_oze ]
     
    m_oze = [ po.replace (".po", ".mo") for po in p_oze ]
     
    for mo in m_oze[:]:
        po = mo.replace (".mo", ".po")
        installenv.Alias ('install', buildenv.MoBuild (mo, [ po, potfile ]))
        installenv.Alias ('moupdate', buildenv.MoBuild (mo, [ po, potfile ]))
        
    for lang in languages[:]:
        modir = (os.path.join (installenv['destdir'] + installenv['prefix'] + '/' + installenv['localedir'], lang + '/LC_MESSAGES/'))
        moname = domain + '.mo'
        installenv.Alias('install', installenv.InstallAs (os.path.join (modir, moname), lang + '.mo'))




environ = env.Copy()
domain = 'VDrift'
environ.Append(PACKAGE=domain)
environ.Append(POTFILE=domain + '.pot')
src_files = Split ("""
../src/main.cpp
../src/gui/spinning_car.cpp
guilists.cpp
optionslist.cpp
""")

gui_files = Split ("""
../data/skins/simple/menus/ActionControlMap
../data/skins/simple/menus/AssignControls
../data/skins/simple/menus/CameraControls
../data/skins/simple/menus/CarControls
../data/skins/simple/menus/ConnectionError
../data/skins/simple/menus/ControlsOptions
../data/skins/simple/menus/DisplayOptions
../data/skins/simple/menus/GameControls
../data/skins/simple/menus/GearsControls
../data/skins/simple/menus/InGameAssignControls
../data/skins/simple/menus/InGameCameraControls
../data/skins/simple/menus/InGameCarControls
../data/skins/simple/menus/InGameControlsOptions
../data/skins/simple/menus/InGameDisplayOptions
../data/skins/simple/menus/InGameGameControls
../data/skins/simple/menus/InGameGearsControls
../data/skins/simple/menus/InGameJoystickCalibrate
../data/skins/simple/menus/InGameJoystickOptions
../data/skins/simple/menus/InGameLeaveConfirm
../data/skins/simple/menus/InGameMenu
../data/skins/simple/menus/InGameMouseOptions
../data/skins/simple/menus/InGameOptions
../data/skins/simple/menus/InGameQuitConfirm
../data/skins/simple/menus/InGameReplaysControls
../data/skins/simple/menus/InGameSoundOptions
../data/skins/simple/menus/InGameToolsControls
../data/skins/simple/menus/InGameTransmissionControls
../data/skins/simple/menus/JoystickCalibrate
../data/skins/simple/menus/JoystickOptions
../data/skins/simple/menus/Main
../data/skins/simple/menus/MouseOptions
../data/skins/simple/menus/NetworkGame
../data/skins/simple/menus/Options
../data/skins/simple/menus/OptionsControlsTab
../data/skins/simple/menus/OptionsDisplayTab
../data/skins/simple/menus/OptionsOld
../data/skins/simple/menus/OptionsSoundTab
../data/skins/simple/menus/Options_WithTabs
../data/skins/simple/menus/PracticeGame
../data/skins/simple/menus/QuitConfirm
../data/skins/simple/menus/Replays
../data/skins/simple/menus/ReplaysControls
../data/skins/simple/menus/RestartGameConfirm
../data/skins/simple/menus/SoundOptions
../data/skins/simple/menus/ToolsControls
../data/skins/simple/menus/TransmissionControls
""")

options_files = Split("""
../data/settings/options.config
""")

sources = []
sources.append(src_files)
sources.append(gui_files)
sources.append(options_files)

if env['NLS']:
    i18n (environ, sources, env)

dist_files = glob.glob('*')
env.Distribute(src_dir, dist_files)
