# vim: set ts=8 sts=2 sw=2 tw=99 et ft=python: 
import os

builder.SetBuildFolder('package')

folder_list = [
  'addons/sourcemod',
  'addons/sourcemod/bin',
  'addons/sourcemod/plugins',
  'addons/sourcemod/plugins/disabled',
  'addons/sourcemod/gamedata',
  'addons/sourcemod/gamedata/core.games',
  'addons/sourcemod/gamedata/sdkhooks.games',
  'addons/sourcemod/gamedata/sdktools.games',
  'addons/sourcemod/gamedata/sm-cstrike.games',
  'addons/sourcemod/configs',
  'addons/sourcemod/configs/geoip',
  'addons/sourcemod/translations',
  'addons/sourcemod/logs',
  'addons/sourcemod/extensions',
  'addons/sourcemod/data',
  'addons/sourcemod/configs/sql-init-scripts',
  'addons/sourcemod/configs/sql-init-scripts/mysql',
  'addons/sourcemod/configs/sql-init-scripts/sqlite',
  'addons/sourcemod/scripting',
  'addons/sourcemod/scripting/include',
  'addons/sourcemod/scripting/admin-flatfile',
  'addons/sourcemod/scripting/adminmenu',
  'addons/sourcemod/scripting/testsuite',
  'addons/sourcemod/scripting/basecommands',
  'addons/sourcemod/scripting/basecomm',
  'addons/sourcemod/scripting/funvotes',
  'addons/sourcemod/scripting/basevotes',
  'addons/sourcemod/scripting/basebans',
  'addons/sourcemod/scripting/funcommands',
  'addons/sourcemod/scripting/playercommands',
  'addons/metamod',
  'cfg/sourcemod',
]

# Create the distribution folder hierarchy.
folder_map = {}
for folder in folder_list:
  norm_folder = os.path.normpath(folder)
  folder_map[folder] = builder.AddFolder(norm_folder)

# Copy binaries.
for cxx_task in SM.binaries:
  builder.AddCopy(cxx_task.binary, folder_map['addons/sourcemod/bin'])
for cxx_task in SM.extensions:
  builder.AddCopy(cxx_task.binary, folder_map['addons/sourcemod/extensions'])
builder.AddCopy(SM.spcomp.binary, folder_map['addons/sourcemod/scripting'])

# Copy version_auto.inc.
for header in SM.generated_headers:
  if 'version_auto.inc' in header.path:
    builder.AddCopy(header, folder_map['addons/sourcemod/scripting/include'])

# Export PDB files. We write to a file in the build folder which is pretty
# verboten, but it's okay if it's in the root since AMBuild will never try
# to rmdir the root.
full_binary_list = SM.binaries + SM.extensions + [SM.spcomp]
with open(os.path.join(builder.buildPath, 'pdblog.txt'), 'w') as fp:
  for task in full_binary_list:
    fp.write(task.debug.path + '\n')

# Copy plugins.
disabled_plugins = set([
  'admin-sql-prefetch.smx',
  'admin-sql-threaded.smx',
  'sql-admin-manager.smx',
  'mapchooser.smx',
  'randomcycle.smx',
  'rockthevote.smx',
  'nominations.smx',
])

for smx_file in SM.smx_files:
  smx_entry = SM.smx_files[smx_file]
  if smx_file in disabled_plugins:
    builder.AddCopy(smx_entry, folder_map['addons/sourcemod/plugins/disabled'])
  else:
    builder.AddCopy(smx_entry, folder_map['addons/sourcemod/plugins'])

# Do all straight-up file copies from the source tree.
def CopyFiles(src, dest, files):
  if not dest:
    dest = src
  dest_entry = folder_map[dest]
  for source_file in files:
    source_path = os.path.join(builder.sourcePath, src, source_file)
    builder.AddCopy(source_path, dest_entry)

CopyFiles('configs', 'addons/sourcemod/configs',
  [ 'admin_groups.cfg',
    'admin_levels.cfg',
    'admin_overrides.cfg',
    'adminmenu_cfgs.txt',
    'adminmenu_custom.txt',
    'adminmenu_grouping.txt',
    'adminmenu_sorting.txt',
    'admins.cfg',
    'admins_simple.ini',
    'banreasons.txt',
    'core.cfg',
    'databases.cfg',
    'languages.cfg',
    'maplists.cfg',
  ]
)
CopyFiles('configs/geoip', 'addons/sourcemod/configs/geoip', ['GeoIP.dat'])
CopyFiles('configs/cfg', 'cfg/sourcemod',
  [ 'sm_warmode_off.cfg',
    'sm_warmode_on.cfg',
    'sourcemod.cfg',
  ]
)
CopyFiles('configs/metamod', 'addons/metamod', ['sourcemod.vdf'])
CopyFiles('configs/sql-init-scripts/mysql', 'addons/sourcemod/configs/sql-init-scripts/mysql',
  [ 'clientprefs-mysql.sql',
    'create_admins.sql',
    'update_admins_r1409.sql',
  ]
)
CopyFiles('configs/sql-init-scripts/sqlite', 'addons/sourcemod/configs/sql-init-scripts/sqlite',
  [ 'admins-sqlite.sq3',
    'clientprefs-sqlite.sq3',
    'clientprefs-sqlite.sql',
    'create_admins.sql',
    'update_admins-r1409.sql',
  ]
)
CopyFiles('gamedata', 'addons/sourcemod/gamedata',
  [ 'funcommands.games.txt',
    'sm-tf2.games.txt',
  ]
)
CopyFiles('gamedata/sdkhooks.games', 'addons/sourcemod/gamedata/sdkhooks.games',
  [ 'common.games.txt',
    'engine.blade.txt',
    'engine.contagion.txt',
    'engine.csgo.txt',
    'engine.darkm.txt',
    'engine.dota.txt',
    'engine.ep2v.txt',
    'engine.insurgency.txt',
    'engine.l4d.txt',
    'game.ag2.txt',
    'game.alienswarm.txt',
    'game.aoc.txt',
    'game.cspromod.txt',
    'game.cstrike.txt',
    'game.dinodday.txt',
    'game.empires.txt',
    'game.ff.txt',
    'game.fof.txt',
    'game.garrysmod.txt',
    'game.gesource.txt',
    'game.hidden.txt',
    'game.hl2ctf.txt',
    'game.insurgency.txt',
    'game.l4d2.txt',
    'game.neotokyo.txt',
    'game.nmrih.txt',
    'game.nucleardawn.txt',
    'game.pvkii.txt',
    'game.sgtls.txt',
    'game.sourceforts.txt',
    'game.synergy.txt',
    'game.zm.txt',
    'game.zpanic.txt',
    'master.games.txt',
  ]
)
CopyFiles('gamedata/sdktools.games', 'addons/sourcemod/gamedata/sdktools.games',
  [ 'common.games.txt',
    'engine.bgt.txt',
    'engine.blade.txt',
    'engine.contagion.txt',
    'engine.csgo.txt',
    'engine.css.txt',
    'engine.darkm.txt',
    'engine.dota.txt',
    'engine.ep1.txt',
    'engine.ep2.txt',
    'engine.ep2valve.txt',
    'engine.eye.txt',
    'engine.insurgency.txt',
    'engine.l4d.txt',
    'engine.l4d2.txt',
    'engine.sdk2013.txt',
    'engine.swarm.txt',
    'game.ag2.txt',
    'game.alienswarm.txt',
    'game.aoc.txt',
    'game.bg2.txt',
    'game.cspromod.txt',
    'game.cstrike.txt',
    'game.dinodday.txt',
    'game.dod.txt',
    'game.dystopia.txt',
    'game.empires.txt',
    'game.esmod.txt',
    'game.fas.txt',
    'game.ff.txt',
    'game.fof.txt',
    'game.garrysmod.txt',
    'game.gesource.txt',
    'game.hidden.txt',
    'game.hl2ctf.txt',
    'game.hl2mp.txt',
    'game.insurgency.txt',
    'game.ios.txt',
    'game.left4dead2.txt',
    'game.neotokyo.txt',
    'game.nmrih.txt',
    'game.nucleardawn.txt',
    'game.obsidian.txt',
    'game.pvkii.txt',
    'game.rnlbeta.txt',
    'game.ship.txt',
    'game.sourceforts.txt',
    'game.synergy.txt',
    'game.tf.txt',
    'game.zm.txt',
    'game.zpanic.txt',
    'master.games.txt',
  ]
)
CopyFiles('gamedata/core.games', 'addons/sourcemod/gamedata/core.games',
  [ 'blacklist.plugins.txt',
    'common.games.txt',
    'engine.bgt.txt',
    'engine.blade.txt',
    'engine.contagion.txt',
    'engine.csgo.txt',
    'engine.css.txt',
    'engine.darkm.txt',
    'engine.dota.txt',
    'engine.ep1.txt',
    'engine.ep2.txt',
    'engine.ep2valve.txt',
    'engine.eye.txt',
    'engine.insurgency.txt',
    'engine.l4d.txt',
    'engine.l4d2.txt',
    'engine.sdk2013.txt',
    'engine.swarm.txt',
    'master.games.txt',
  ]
)
CopyFiles('gamedata/sm-cstrike.games', 'addons/sourcemod/gamedata/sm-cstrike.games',
  [ 'game.csgo.txt',
    'game.css.txt',
    'master.games.txt',
  ]
)
CopyFiles('plugins', 'addons/sourcemod/scripting',
  [ 'admin-sql-prefetch.sp',
    'admin-sql-threaded.sp',
    'adminhelp.sp',
    'adminmenu.sp',
    'antiflood.sp',
    'basebans.sp',
    'basechat.sp',
    'basecomm.sp',
    'basecommands.sp',
    'basetriggers.sp',
    'basevotes.sp',
    'clientprefs.sp',
    'funcommands.sp',
    'funvotes.sp',
    'mapchooser.sp',
    'nextmap.sp',
    'nominations.sp',
    'playercommands.sp',
    'randomcycle.sp',
    'reservedslots.sp',
    'rockthevote.sp',
    'sounds.sp',
    'sql-admin-manager.sp',
  ]
)
CopyFiles('plugins/include', 'addons/sourcemod/scripting/include',
  [ 'admin.inc',
    'adminmenu.inc',
    'adt.inc',
    'adt_array.inc',
    'adt_stack.inc',
    'adt_trie.inc',
    'banning.inc',
    'basecomm.inc',
    'bitbuffer.inc',
    'clientprefs.inc',
    'clients.inc',
    'commandfilters.inc',
    'console.inc',
    'core.inc',
    'cstrike.inc',
    'datapack.inc',
    'dbi.inc',
    'entity.inc',
    'entity_prop_stocks.inc',
    'events.inc',
    'files.inc',
    'float.inc',
    'functions.inc',
    'geoip.inc',
    'halflife.inc',
    'handles.inc',
    'helpers.inc',
    'keyvalues.inc',
    'lang.inc',
    'logging.inc',
    'mapchooser.inc',
    'menus.inc',
    'nextmap.inc',
    'profiler.inc',
    'protobuf.inc',
    'regex.inc',
    'sdkhooks.inc',
    'sdktools.inc',
    'sdktools_client.inc',
    'sdktools_engine.inc',
    'sdktools_entinput.inc',
    'sdktools_entoutput.inc',
    'sdktools_functions.inc',
    'sdktools_gamerules.inc',
    'sdktools_hooks.inc',
    'sdktools_sound.inc',
    'sdktools_stocks.inc',
    'sdktools_stringtables.inc',
    'sdktools_tempents.inc',
    'sdktools_tempents_stocks.inc',
    'sdktools_trace.inc',
    'sdktools_voice.inc',
    'sorting.inc',
    'sourcemod.inc',
    'string.inc',
    'testing.inc',
    'textparse.inc',
    'tf2.inc',
    'tf2_stocks.inc',
    'timers.inc',
    'topmenus.inc',
    'usermessages.inc',
    'vector.inc',
    'version.inc',
  ]
)
CopyFiles('translations', 'addons/sourcemod/translations',
  [ 'adminhelp.phrases.txt',
    'adminmenu.phrases.txt',
    'antiflood.phrases.txt',
    'basebans.phrases.txt',
    'basecomm.phrases.txt',
    'basetriggers.phrases.txt',
    'basevotes.phrases.txt',
    'clientprefs.phrases.txt',
    'common.phrases.txt',
    'core.phrases.txt',
    'funcommands.phrases.txt',
    'funvotes.phrases.txt',
    'mapchooser.phrases.txt',
    'nextmap.phrases.txt',
    'nominations.phrases.txt',
    'playercommands.phrases.txt',
    'plugin.basecommands.txt',
    'reservedslots.phrases.txt',
    'rockthevote.phrases.txt',
    'sounds.phrases.txt',
    'sqladmins.phrases.txt',
  ]
)
CopyFiles('public/licenses', 'addons/sourcemod',
  [ 'GPLv2.txt',
    'GPLv3.txt',
    'LICENSE.txt'
  ]
)
CopyFiles('plugins/admin-flatfile', 'addons/sourcemod/scripting/admin-flatfile',
  [ 'admin-flatfile.sp',
    'admin-groups.sp',
    'admin-overrides.sp',
    'admin-simple.sp',
    'admin-users.sp',
  ]
)
CopyFiles('plugins/adminmenu', 'addons/sourcemod/scripting/adminmenu', ['dynamicmenu.sp'])
CopyFiles('plugins/testsuite', 'addons/sourcemod/scripting/testsuite',
  [ 'benchmark.sp',
    'bug4059.sp',
    'callfunctest.sp',
    'capstest.sp',
    'clientprefstest.sp',
    'cstrike-test.sp',
    'entpropelements.sp',
    'fakenative1.sp',
    'fakenative2.sp',
    'filetest.sp',
    'fwdtest1.sp',
    'fwdtest2.sp',
    'gamerules-props.sp',
    'goto_test.sp',
    'outputtest.sp',
    'ptstest.sp',
    'sorttest.sp',
    'sqltest.sp',
    'sqltest.sql',
    'stacktest.sp',
    'structtest.sp',
    'tf2-test.sp',
    'tries.sp',
  ]
)
CopyFiles('plugins/basecommands', 'addons/sourcemod/scripting/basecommands',
  [ 'cancelvote.sp',
    'execcfg.sp',
    'kick.sp',
    'map.sp',
    'reloadadmins.sp',
    'who.sp',
  ]
)
CopyFiles('plugins/basecomm', 'addons/sourcemod/scripting/basecomm',
  [ 'forwards.sp',
    'gag.sp',
    'natives.sp',
  ]
)
CopyFiles('plugins/funvotes', 'addons/sourcemod/scripting/funvotes',
  [ 'votealltalk.sp',
    'voteburn.sp',
    'voteff.sp',
    'votegravity.sp',
    'voteslay.sp',
  ]
)
CopyFiles('plugins/basevotes', 'addons/sourcemod/scripting/basevotes',
  [ 'voteban.sp',
    'votekick.sp',
    'votemap.sp',
  ]
)
CopyFiles('plugins/basebans', 'addons/sourcemod/scripting/basebans', ['ban.sp'])
CopyFiles('plugins/funcommands', 'addons/sourcemod/scripting/funcommands',
  [ 'beacon.sp',
    'blind.sp',
    'drug.sp',
    'fire.sp',
    'gravity.sp',
    'ice.sp',
    'noclip.sp',
    'timebomb.sp',
  ]
)
CopyFiles('plugins/playercommands', 'addons/sourcemod/scripting/playercommands',
  [ 'rename.sp',
    'slap.sp',
    'slay.sp',
  ]
)

if builder.target_platform == 'windows':
  CopyFiles('sourcepawn/batchtool', 'addons/sourcemod/scripting', ['compile.exe'])
else:
  CopyFiles('plugins', 'addons/sourcemod/scripting', ['compile.sh'])
