# Copyright 2017 The Cobalt Authors. All Rights Reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#     http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
"""Generate a header for conversion of generated types.

Generate a header with forward declarations for conversion functions to and from
JavaScript values.
"""

from optparse import OptionParser  # pylint: disable=deprecated-module
import os
import pickle
import sys

bindings_dir = os.path.join(
    os.path.dirname(__file__),
    '../../third_party/blink/Source/bindings/scripts')
sys.path.insert(0, bindings_dir)

# pylint:disable=wrong-import-position
from utilities import ComponentInfoProviderCobalt
from utilities import write_file


def create_component_info_provider(interfaces_info_path, component_info_path):
  with open(os.path.join(interfaces_info_path), 'rb') as interface_info_file:
    interfaces_info = pickle.load(interface_info_file)
  with open(os.path.join(component_info_path), 'rb') as component_info_file:
    component_info = pickle.load(component_info_file)
  return ComponentInfoProviderCobalt(interfaces_info, component_info)


def parse_options():
  """Parse options needed for generating the header."""
  parser = OptionParser()
  parser.add_option(
      '--cache-directory', help='cache directory, defaults to output directory')
  parser.add_option('--component-info')
  parser.add_option('--interfaces-info')
  parser.add_option('--output-directory')
  options, args = parser.parse_args()

  assert not args
  return options


def generate_header(code_generator_class):
  """Generate a header with forward declarations for type conversions."""
  options = parse_options()

  # Create a CodeGeneratorCobalt, which will generate the file.
  cobalt_info_provider = create_component_info_provider(options.interfaces_info,
                                                        options.component_info)
  generator = code_generator_class(
      info_provider=cobalt_info_provider,
      cache_dir=options.cache_directory,
      output_dir=options.output_directory)

  # Generate the file and write it out to the specified path.
  header_path, header_text = generator.generate_conversion_code()
  write_file(header_text, header_path)
