#!/usr/bin/env python3

import json
import os
import re
import subprocess
import sys
from collections import OrderedDict

script_dir = os.path.dirname(os.path.abspath(__file__))
root_dir = os.path.dirname(script_dir)
sys.path.append(root_dir)

import emsdk  # noqa


def version_key(version_string):
  parts = re.split('[.-]', version_string)
  key = [[int(part) for part in parts[:3]], -len(parts), parts[3:]]
  return key


def main(args):
  if subprocess.check_output(['git', 'status', '--porcelain'], cwd=root_dir).strip():
    print('tree is not clean')
    sys.exit(1)

  release_info = emsdk.load_releases_info()
  new_version = version_key(release_info['aliases']['latest'])[0]
  new_version[-1] += 1

  new_version = '.'.join(str(part) for part in new_version)
  asserts_hash = None
  is_github_runner = False
  if args:
    new_hash = args[0]
    if len(args) > 1:
      asserts_hash = args[1]
    if len(args) > 2 and args[2] == '--action':
      is_github_runner = True
  else:
    new_hash = emsdk.get_emscripten_releases_tot()
  print('Creating new release: %s -> %s' % (new_version, new_hash))
  release_info['releases'][new_version] = new_hash
  if asserts_hash:
    asserts_name = new_version + '-asserts'
    release_info['releases'][asserts_name] = asserts_hash

  releases = [(k, v) for k, v in release_info['releases'].items()]
  releases.sort(key=lambda pair: version_key(pair[0]))

  release_info['releases'] = OrderedDict(reversed(releases))
  release_info['aliases']['latest'] = new_version

  with open(os.path.join(root_dir, 'emscripten-releases-tags.json'), 'w') as f:
    f.write(json.dumps(release_info, indent=2))
    f.write('\n')

  subprocess.check_call(
    [sys.executable, os.path.join(script_dir, 'update_bazel_workspace.py')],
    cwd=root_dir)

  branch_name = 'version_' + new_version

  if is_github_runner: # For GitHub Actions workflows
    with open(os.environ['GITHUB_ENV'], 'a') as f:
      f.write(f'RELEASE_VERSION={new_version}')
  else: # Local use
    # Create a new git branch
    subprocess.check_call(['git', 'checkout', '-b', branch_name, 'origin/main'], cwd=root_dir)

    # Create auto-generated changes to the new git branch
    subprocess.check_call(['git', 'add', '-u', '.'], cwd=root_dir)
    subprocess.check_call(['git', 'commit', '-m', new_version], cwd=root_dir)
    print('New release created in branch: `%s`' % branch_name)

    # Push new branch to origin
    subprocess.check_call(['git', 'push', 'origin', branch_name], cwd=root_dir)

  return 0


if __name__ == '__main__':
  sys.exit(main(sys.argv[1:]))
