#!/usr/bin/python

#
# Copyright 2016 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.
#
"""Flatten a set of IDLs.

Scan the specified directories for IDL files, filter out any ignored IDLs, and
then parse them. Flatten the parsed IDLs and write them out as a simple
representation of the members of each interface to the output directory.
"""

import argparse
from collections import defaultdict
import fnmatch
import os
import pickle
import sys
import textwrap


class FlattenedInterface(object):
  """Simplified representation of an IDL interface."""

  def __init__(self, name, operations, attributes, constants, constructors):
    """Initialize a FlattenedInterface object.

    Args:
      name: The name of the interface.
      operations: A list of strings representing the names of operations on the
          interface.
      attributes: A list of strings representing the names of attributes on the
          interface.
      constants: A list of strings representing the names of constants on the
          interface.
      constructors: A list of strings representing the names of constructors on
          the interface. For simplicity, the Interface Object is considered a
          constructor even if it's not callable.
    """
    self.name = name
    self.operations = operations
    self.attributes = attributes
    self.constants = constants
    self.constructors = constructors

  @classmethod
  def FromIdlInterface(cls, idl_interface):
    """Create a FlattenedInterface object from an IdlInterface object.

    Args:
      idl_interface: An idl_definitions.IdlInterface object.

    Returns:
      A new FlattenedInterface with the same properties as the IdlInterface.
    """
    operations = [o.name for o in idl_interface.operations]
    attributes = [a.name for a in idl_interface.attributes]
    constants = [c.name for c in idl_interface.constants]

    constructors = []

    if not idl_interface.extended_attributes.has_key('NoInterfaceObject'):
      constructors.append(idl_interface.name)
    if 'Constructor' in idl_interface.extended_attributes:
      constructors.append(idl_interface.name)
    if 'NamedConstructor' in idl_interface.extended_attributes:
      constructors.append(idl_interface.extended_attributes['NamedConstructor'])
    return cls(idl_interface.name, operations, attributes, constants,
               constructors)

  @classmethod
  def Difference(cls, lhs, rhs):
    """Determine all the properties in lhs that are not in rhs.

    Both |lhs| and |rhs| should describe the same interface. That is, they
    should have the same name.

    Args:
      lhs: A FlattenedInterface object.
      rhs: A FlattenedInterface object.

    Returns:
      A new FlattenedInterface object with only the properties that exist on
      |lhs| and do not exist on |rhs|.
    """
    assert lhs.name == rhs.name
    operations = list(set(lhs.operations).difference(rhs.operations))
    attributes = list(set(lhs.attributes).difference(rhs.attributes))
    constants = list(set(lhs.constants).difference(rhs.constants))
    constructors = list(set(lhs.constructors).difference(rhs.constructors))
    return cls(lhs.name, operations, attributes, constants, constructors)

  def IsEmpty(self):
    """Return True if this FlattenedInterface has no properties."""
    return not (self.operations or self.attributes or self.constants)

  @classmethod
  def SaveToPickle(cls, flattened_interfaces, output_file):
    """Pickle a list of FlattenedInterface objects.

    Args:
      flattened_interfaces: A list of FlattenedInterface instances.
      output_file: Path to which the pickle file will be written.
    """
    flattened_interfaces = list(flattened_interfaces)
    assert all((isinstance(i, cls) for i in flattened_interfaces))
    with open(output_file, 'w', encoding='utf-8') as f:
      pickle.dump(flattened_interfaces, f)

  @classmethod
  def LoadFromPickle(cls, pickle_file):
    """Load a list of FlattenedInterface objects from a pickle file.

    Args:
      pickle_file: A pickle file created from the SaveToPickle function.
    Returns:
      A list of FlattenedInterface objects.
    """
    with open(pickle_file, encoding='utf-8') as f:
      unpickled_list = pickle.load(f)
    assert all((isinstance(item, cls) for item in unpickled_list))
    return unpickled_list


def _GatherIDLFiles(dirname, ignore_patterns):
  """Walk all directories under |dirname| for files with the .idl extension."""

  def MatchesIgnorePattern(idl_path):
    return any(
        (fnmatch.fnmatch(idl_path, pattern) for pattern in ignore_patterns))

  for root, _, filenames in os.walk(dirname):
    idl_paths = (
        os.path.join(root, file) for file in fnmatch.filter(filenames, '*.idl'))
    for idl_path in idl_paths:
      if not MatchesIgnorePattern(idl_path):
        yield idl_path


def _FlattenInterfaces(idl_files):
  """Parse the list of idl_files and return a list of FlattenedInterfaces."""
  # Import idl_reader here rather than at the beginning of the file because the
  # module import path will be set based on an argument to this script.
  import idl_reader  # pylint: disable=import-outside-toplevel

  # Create an IdlReader that will parse the IDL and return the internal
  # representation of the interface.
  reader = idl_reader.IdlReader()

  # Map the interface name to an IdlInterface instance.
  interfaces = {}

  # Map an interface name to a list of its partial interfaces.
  partial_interfaces = defaultdict(list)

  # Map an interface name to the list of interfaces that it implements using
  # the 'implements' keyword.
  implemented_interfaces = defaultdict(list)

  # Parse each IDL in the list individually.
  for idl in idl_files:
    # Parse the IDL and get the idl_definitions.IdlDefinitions object.
    d = reader.read_idl_file(idl)

    # Track each interface that implements or is implemented by this interface.
    for i in d.implements:
      implemented_interfaces[i.left_interface].append(i.right_interface)

    for name, interface in d.interfaces.items():
      # Ignore callback interfaces.
      if interface.is_callback:
        continue

      if interface.is_partial:
        partial_interfaces[name].append(interface)
      else:
        assert name not in interfaces, ('Multiple IDL files found for '
                                        f'interface: {name}')
        interfaces[name] = interface

  # Merge partial interfaces into their main interface.
  for name, interface_list in partial_interfaces.items():
    for partial_interface in interface_list:
      interfaces[name].merge(partial_interface)

  all_implemented_interfaces = set()
  # Merge implemented interfaces into the interface that implements them.
  for lhs, interface_list in implemented_interfaces.items():
    for rhs in interface_list:
      interfaces[lhs].merge(interfaces[rhs])
      all_implemented_interfaces.add(rhs)

  # Sanity check that all interfaces that are on the right-hand-side also do
  # not have constructors.
  for interface in all_implemented_interfaces:
    assert not interfaces[interface].constructors

  # Convert the idl_definition.IdlInterface objects to FlattenedInterface
  # objects. Ignore interfaces that were on the right-hand-side of an implements
  # statement.
  return [
      FlattenedInterface.FromIdlInterface(interface)
      for name, interface in interfaces.items()
      if name not in all_implemented_interfaces
  ]


def main(argv):
  """Main function."""
  parser = argparse.ArgumentParser(
      formatter_class=argparse.RawDescriptionHelpFormatter,
      description=textwrap.dedent(__doc__))
  parser.add_argument(
      '-d',
      '--directory',
      action='append',
      required=True,
      dest='directories',
      help='Directories to search (recursively) for .idl files.')
  parser.add_argument(
      '-i',
      '--ignore',
      action='append',
      default=[],
      help='Ignore IDLs whose path contains the argument.')
  parser.add_argument(
      '-o',
      '--output_path',
      required=True,
      help='File into which flattened .idl files will be written.')
  parser.add_argument(
      '--blink_scripts_dir',
      required=True,
      help=('Specify the directory from which blink\'s scripts should be '
            'imported.'))

  options = parser.parse_args(argv)

  if not os.path.isdir(options.blink_scripts_dir):
    raise RuntimeError(f'{options.blink_scripts_dir} is not a directory')

  # Set the script directory dynamically. This ensures that Blink's IDLs will
  # be loaded using Blink's IDL parsing scripts (and Cobalt IDLs will be loaded
  # using Cobalt's fork).
  # If the public interface to IdlReader or the IdlDefinitions class diverge too
  # much, we may have to refactor this into two functions.
  sys.path.append(options.blink_scripts_dir)

  idl_files = set()
  for directory in options.directories:
    idl_files.update(_GatherIDLFiles(directory, options.ignore))

  flattened_interfaces = _FlattenInterfaces(idl_files)

  FlattenedInterface.SaveToPickle(flattened_interfaces, options.output_path)

  return 0


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