#!/usr/bin/env python
# Copyright (c) 2018 The Chromium Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
"""code generator for gpu workaround definitions"""

import os
import os.path
import sys
from optparse import OptionParser

_LICENSE = """// Copyright 2018 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

"""

_DO_NOT_EDIT_WARNING = ("// This file is auto-generated from " +
                        os.path.basename(__file__) + "\n" +
                        "// DO NOT EDIT!\n\n")

def merge_files_into_workarounds(files):
  workarounds = set()
  for filename in files:
    with open(filename, 'r') as f:
      workarounds.update([workaround.strip() for workaround in f])
  return sorted(list(workarounds))


def write_header(filename, workarounds):
  max_workaround_len = len(max(workarounds, key=len))

  with open(filename, 'w') as f:
    f.write(_LICENSE)
    f.write(_DO_NOT_EDIT_WARNING)

    indent = '  '
    macro = 'GPU_OP'

    # length of max string passed to write + 1
    max_len = len(indent) + len(macro) + 1 + max_workaround_len + 1 + 1
    write = lambda line: f.write(line + ' ' * (max_len - len(line)) + '\\\n')

    write('#define GPU_DRIVER_BUG_WORKAROUNDS(GPU_OP)')
    for w in workarounds:
      write(indent + macro + '(' + w.upper() + ',')
      write(indent + ' ' * (len(macro) + 1) + w + ')')

    # one extra line to put 'The End' comment.
    f.write('// The End\n')


def main(argv):
  usage = "usage: %prog [options] file1 file2 file3 etc"
  parser = OptionParser(usage=usage)
  parser.add_option(
      "--output-file",
      dest="output_file",
      default="gpu_driver_bug_workaround_autogen.h",
      help="the name of the header file to write")

  (options, _) = parser.parse_args(args=argv)

  workarounds = merge_files_into_workarounds(parser.largs)
  write_header(options.output_file, workarounds)


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