#!/usr/bin/env python
# Copyright (c) 2012 The Chromium Embedded Framework Authors. All rights
# reserved. Use of this source code is governed by a BSD-style license
# that can be found in the LICENSE file.
"""
A simple utility function to merge pack resource files into a single resource file.
"""

from __future__ import absolute_import
from __future__ import print_function
from date_util import *
from file_util import *
import os
import re
import string
import sys


def MakeFileSegment(input, all_names):
  result = """

// ---------------------------------------------------------------------------
// From $FILE$:
"""

  filename = os.path.split(input)[1]
  result = result.replace('$FILE$', filename)

  contents = read_file(input)

  # Format for Windows builds with resource whitelisting enabled [1]:
  #   #define IDR_RESOURCE_NAME (::ui::WhitelistedResource<12345>(), 12345)
  # Format for other builds:
  #   #define IDR_RESOURCE_NAME 12345
  # [1] See https://crbug.com/684788#c18

  regex = '#define\s([A-Za-z0-9_]{1,})\s'
  if contents.find('ui::WhitelistedResource') > 0:
    regex += '.*<'
  regex += '([0-9]{1,})'

  # identify the defines in the file
  p = re.compile(regex)
  list = p.findall(contents)
  for name, id in list:
    # If the same define exists in multiple files add a suffix.
    if name in all_names:
      all_names[name] += 1
      name += '_%d' % all_names[name]
    else:
      all_names[name] = 1

    result += "\n#define %s %s" % (name, id)

  return result


def MakeFile(output, input):
  # header string
  result = \
"""// Copyright (c) $YEAR$ Marshall A. Greenblatt. All rights reserved.
//
// Redistribution and use in source and binary forms, with or without
// modification, are permitted provided that the following conditions are
// met:
//
//    * Redistributions of source code must retain the above copyright
// notice, this list of conditions and the following disclaimer.
//    * Redistributions in binary form must reproduce the above
// copyright notice, this list of conditions and the following disclaimer
// in the documentation and/or other materials provided with the
// distribution.
//    * Neither the name of Google Inc. nor the name Chromium Embedded
// Framework nor the names of its contributors may be used to endorse
// or promote products derived from this software without specific prior
// written permission.
//
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
//
// ---------------------------------------------------------------------------
//
// This file is generated by the make_pack_header.py tool.
//

#ifndef $GUARD$
#define $GUARD$
#pragma once"""

  # sort the input files by name
  input = sorted(input, key=lambda path: os.path.split(path)[1])

  all_names = {}

  # generate the file segments
  for file in input:
    result += MakeFileSegment(file, all_names)

  # footer string
  result += \
"""

#endif  // $GUARD$
"""

  # add the copyright year
  result = result.replace('$YEAR$', get_year())
  # add the guard string
  filename = os.path.split(output)[1]
  guard = 'CEF_INCLUDE_' + filename.replace('.', '_').upper() + '_'
  result = result.replace('$GUARD$', guard)

  write_file_if_changed(output, result)


def main(argv):
  if len(argv) < 3:
    print(("Usage:\n  %s <output_filename> <input_file1> [input_file2] ... " %
           argv[0]))
    sys.exit(-1)
  MakeFile(argv[1], argv[2:])


if '__main__' == __name__:
  main(sys.argv)
