#!/usr/bin/env python


"""Run Cluster Telemetry to compute n-grams from SKPs."""


import argparse
import os
import re
import subprocess
import sys
import tempfile


NGRAMS_LUA_SUBSTITUTION_STR = '-- CHANGEME\nlocal n = \d+\n-- CHANGEME'
SCRIPT_DIR = os.path.dirname(os.path.realpath(__file__))


def main():
  # Parse arguments.
  parser = argparse.ArgumentParser(
      description='Run Cluster Telemetry to compute n-grams from SKPs.')
  parser.add_argument('--n', help='Compute n-grams with this integer as N',
                      required=True)
  args, extra_args = parser.parse_known_args()

  # Read the n-gram Lua script.
  script_path = os.path.join(SCRIPT_DIR, 'ngrams.lua')
  with open(script_path) as f:
    script_contents = f.read()

  # Replace the default value of n with the value specified by the user.
  new_contents, subd = re.subn(NGRAMS_LUA_SUBSTITUTION_STR,
                               'local n = %s' % args.n, script_contents, 1)
  if subd != 1:
    raise Exception('Unable to replace N in %s; expected to find:\n%s' % (
                    script_path, sub))

  # Write the new script contents to a temporary file.
  tmp_script = tempfile.NamedTemporaryFile(delete=False)
  try:
    tmp_script.write(new_contents)
    tmp_script.close()

    # Run trigger_ct_lua with the new script, forwarding the rest of the
    # passed-in arguments to the script.
    trigger_ct_lua = os.path.join(SCRIPT_DIR, 'trigger_ct_lua')
    cmd = ['python', trigger_ct_lua,
           '--script', tmp_script.name,
           '--aggregator', os.path.join(SCRIPT_DIR, 'ngrams_aggregate.lua')]
    cmd.extend(extra_args)
    try:
      subprocess.check_call(cmd)
    except subprocess.CalledProcessError:
      exit(1)
  finally:
    os.remove(tmp_script.name)


if __name__ == '__main__':
  main()
