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

MMSPlugin.plugin_name = 'cs2fixes'
MMSPlugin.plugin_alias = 'cs2fixes'

for sdk_target in MMSPlugin.sdk_targets:
  sdk = sdk_target.sdk
  cxx = sdk_target.cxx

  binary = MMSPlugin.HL2Library(builder, cxx, MMSPlugin.plugin_name, sdk)
  
  try:
    version = subprocess.check_output(['git', 'describe', '--tags', '--long']).decode('ascii').strip()
  except subprocess.SubprocessError as e:
    version = "1.7-dev"
    print("git describe failed as there are no tags")
	
  print(f'Setting version to "{version}"')
	
  binary.compiler.defines += ['CS2FIXES_VERSION="' + version + '"']

  if binary.compiler.behavior == 'gcc':
    binary.compiler.cxxflags += ['-Wno-invalid-offsetof']

  binary.compiler.cxxincludes += [
    os.path.join(builder.sourcePath, 'src', 'cs2_sdk'),
    os.path.join(builder.sourcePath, 'src', 'utils'),
    os.path.join(builder.sourcePath, 'sdk', 'thirdparty', 'protobuf-3.21.8', 'src'),
    os.path.join(builder.sourcePath, 'vendor', 'funchook', 'include'),
  ]

  target_folder = 'Debug' if builder.options.debug else 'Release'

  if binary.compiler.target.platform == 'linux':
    binary.compiler.postlink += [
      os.path.join(builder.sourcePath, 'vendor', 'funchook', 'lib', target_folder, 'libfunchook.a'),
      os.path.join(builder.sourcePath, 'vendor', 'funchook', 'lib', target_folder, 'libdistorm.a'),
      os.path.join(builder.sourcePath, 'sdk', 'lib', 'linux64', 'release', 'libprotobuf.a'),
    ]
    binary.sources += ['src/utils/plat_unix.cpp']
  elif binary.compiler.target.platform == 'windows':
    binary.compiler.postlink += [
      os.path.join('psapi.lib'),
      os.path.join(builder.sourcePath, 'vendor', 'funchook', 'lib', target_folder, 'funchook.lib'),
      os.path.join(builder.sourcePath, 'vendor', 'funchook', 'lib', target_folder, 'distorm.lib'),
      os.path.join(builder.sourcePath, 'sdk', 'lib' ,'public', 'win64', '2015', 'libprotobuf.lib'),
      os.path.join(builder.sourcePath, 'sdk', 'lib', 'public', 'win64', 'steam_api64.lib')
    ]
    binary.sources += ['src/utils/plat_win.cpp']


  binary.sources += [
    'src/cs2fixes.cpp',
    'src/mempatch.cpp',
    'src/patches.cpp',
    'src/cvars.cpp',
    'src/adminsystem.cpp',
    'src/commands.cpp',
    'src/addresses.cpp',
    'src/detours.cpp',
    #'src/entities.cpp',
    'src/events.cpp',
    'src/utils/entity.cpp',
    #'src/utils/weapon.cpp',
    #'src/cs2_sdk/entity/services.cpp',
    'src/cs2_sdk/schema.cpp',
    'src/ctimer.cpp',
    #'src/panoramavote.cpp',
    'src/playermanager.cpp',
    'src/gameconfig.cpp',
    'src/gamesystem.cpp',
    #'src/votemanager.cpp',
    #'src/httpmanager.cpp',
    #'src/discord.cpp',
    #'src/map_votes.cpp',
    #'src/entwatch.cpp',
    #'src/user_preferences.cpp',
    #'src/zombiereborn.cpp',
    #'src/customio.cpp',
    'src/entitylistener.cpp',
    #'src/leader.cpp',
    #'src/buttonwatch.cpp',
    #'src/idlemanager.cpp',
    'src/cs2astra.cpp',
    'src/cs2astra/acommands.cpp',
    'src/cs2astra/adminastra.cpp',
    'src/cs2astra/reserved_slot.cpp',
    #'src/cs2astra/aidlemanager.cpp',
    #'src/cs2astra/weapons_restrict.cpp',
    #'src/cs2astra/announcements.cpp',
    'src/cs2astra/astrafixes.cpp',
    'src/cs2astra/slay_losers.cpp',
    #'src/cs2astra/damage_info.cpp',
    #'src/cs2astra/vote_map.cpp',
    #'src/cs2astra/afk_astra.cpp',
    #'src/cs2astra/mysql_import.cpp',
    'sdk/entity2/entitysystem.cpp',
    'sdk/entity2/entityidentity.cpp',
    'sdk/entity2/entitykeyvalues.cpp',
    'sdk/tier1/keyvalues3.cpp',
  ]

  protoc_builder = builder.tools.Protoc(protoc = sdk_target.protoc, sources = [
    os.path.join(sdk['path'], 'common', 'network_connection.proto'),
    os.path.join(sdk['path'], 'common', 'netmessages.proto'),
    os.path.join(sdk['path'], 'common', 'networkbasetypes.proto'),
    os.path.join(sdk['path'], 'common', 'engine_gcmessages.proto'),
    os.path.join(sdk['path'], 'gcsdk', 'steammessages.proto'),
    os.path.join(sdk['path'], 'gcsdk', 'gcsdk_gcmessages.proto'),
    os.path.join(sdk['path'], 'game', 'shared', 'gameevents.proto'),
    os.path.join(sdk['path'], 'game', 'shared', 'te.proto'),
    os.path.join(sdk['path'], 'game', 'shared', 'usercmd.proto'),
    os.path.join(sdk['path'], 'game', 'shared', 'usermessages.proto'),
    os.path.join(builder.sourcePath, 'protobuf', 'cs_gameevents.proto'),
    os.path.join(builder.sourcePath, 'protobuf', 'cs_usercmd.proto'),
    os.path.join(builder.sourcePath, 'protobuf', 'cstrike15_gcmessages.proto'),
    os.path.join(builder.sourcePath, 'protobuf', 'cstrike15_usermessages.proto'),
    os.path.join(builder.sourcePath, 'protobuf', 'networksystem_protomessages.proto'),
  ])
  protoc_builder.protoc.includes += [
    os.path.join(sdk['path'], 'gcsdk'),
    os.path.join(sdk['path'], 'common'),
    os.path.join(sdk['path'], 'game', 'shared'),
    os.path.join(builder.sourcePath, 'protobuf'),
  ]

  binary.custom = [protoc_builder]

  nodes = builder.Add(binary)
  MMSPlugin.binaries += [nodes]
