# vim: set ts=2 sw=2 tw=99 noet ft=python: 
import os
import glob

builder.SetBuildFolder('package')

class SDKPackage:
  sdk_name = None

  plugin_folder_path = None
  plugin_folder = None

  metamod_path = None
  metamod = None

  bin_path = None
  bin = None

  def __init__(self, cxx, sdk_name):
    self.sdk_name = sdk_name

    self.plugin_folder_path = os.path.join(self.sdk_name, 'addons', MMSPlugin.metadata['name'])
    self.plugin_folder = builder.AddFolder(self.plugin_folder_path)

    self.metamod_path = os.path.join(self.sdk_name, 'addons', 'metamod')
    self.metamod = builder.AddFolder(self.metamod_path)

    self.addBinFolder(cxx)
    self.generateVDF()

  def addBinFolder(self, cxx):
    platform64_path_map = {
      'windows': 'win64',
      'linux': 'linuxsteamrt64',
      'mac': 'osx64'
    }

    if cxx.target.arch == 'x86_64':
      self.bin_path = os.path.join(self.plugin_folder_path, 'bin', platform64_path_map[cxx.target.platform])
    else:
      self.bin_path = os.path.join(self.plugin_folder_path, 'bin')
    
    self.bin = builder.AddFolder(self.bin_path)

  def generateVDF(self):
    vdf_content = '"Metamod Plugin"\n'
    vdf_content += '{\n'
    vdf_content += f'\t"alias"\t"{MMSPlugin.metadata["alias"]}"\n'
    vdf_content += f'\t"file"\t"{os.path.join(os.path.relpath(self.bin_path, self.sdk_name), MMSPlugin.metadata["name"])}"\n'
    vdf_content += '}'

    builder.AddOutputFile(os.path.join(self.metamod_path, f'{MMSPlugin.metadata["name"]}.vdf'), vdf_content.encode('utf8'))

  def addBinary(self, binary):
    (_, plugin_bin_name) = os.path.split(binary.path)
    plugin_bin_ext = os.path.splitext(plugin_bin_name)[1]

    builder.AddCopy(binary, os.path.join(self.bin_path, MMSPlugin.metadata['name'] + plugin_bin_ext))

  # Adds file relative to plugin folder
  def addFile(self, file_path, result_path = None):
    if not os.path.isabs(file_path):
      file_path = os.path.join(builder.sourcePath, file_path)

    if result_path is None:
      result_path = os.path.join(self.plugin_folder_path, os.path.basename(file_path))
    else:
      result_path = os.path.join(self.plugin_folder_path, result_path)

    builder.AddFolder(os.path.dirname(result_path))
    builder.AddCopy(file_path, result_path)

  # Adds directory relative to plugins folder
  def addFolder(self, folder_path, result_path = None, search_ext = '*', recursive = True):
    if not os.path.isabs(folder_path):
      folder_path = os.path.join(builder.sourcePath, folder_path)

    if result_path is None:
      result_path = os.path.join(self.plugin_folder_path, os.path.basename(folder_path))

    search_param = f'*.{search_ext}'
    if recursive:
      search_param = os.path.join('**', search_param)

    for file in glob.glob(os.path.join(folder_path, search_param), recursive = recursive):
      self.addFile(file, os.path.join(result_path, os.path.relpath(file, folder_path)))

packages = dict()

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

  packages[sdk['name']] = SDKPackage(cxx, sdk['name'])

pdb_list = []
for task in MMSPlugin.binaries:
  # Determine which sdk this binary belongs to since we encode it in its name
  binary_filename = os.path.splitext(os.path.basename(task.binary.path))[0]
  sdk_name = binary_filename.split('.')[-1]
  
  packages[sdk_name].addBinary(task.binary)

  # Add custom stuff here
  # Examples:
  # packages[sdk_name].addFolder('some_folder_with_files')
  # packages[sdk_name].addFile('configs/config.cfg', 'other/new_name_for_a_config.cfg')

  if task.debug:
    pdb_list.append(task.debug)

# Generate PDB info.
with open(os.path.join(builder.buildPath, 'pdblog.txt'), 'wt') as fp:
  for line in pdb_list:
    fp.write(line.path + '\n')