#!/usr/bin/env python2.7
# Copyright 2018 The Fuchsia Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.

import argparse
import os
import re
import subprocess
import sys


FUCHSIA_ROOT = os.path.dirname(  # $root
    os.path.dirname(             # scripts
    os.path.dirname(             # style
    os.path.abspath(__file__))))

VENDOR_REGEX = r'^%s/vendor/(\w+)' % FUCHSIA_ROOT

DEFAULT_NAMESPACES = [
    'fidl',
    'fuchsia',
    'test',
    'zx',  # Syscalls definitions are in the zx library.
    'zz',  # TODO(scottmg): This is a temporary name, equivalent to "zx".
]

IGNORED_DIRS = ['scripts', 'tools']


def main():
    parser = argparse.ArgumentParser(
            description=('Checks that FIDL libraries in a given repo are '
                         'properly namespaced'))
    parser.add_argument('--repo', help='The repo to analyze', required=True)
    args = parser.parse_args()

    repo = os.path.abspath(args.repo)
    vendor_match = re.search(VENDOR_REGEX, repo)
    if vendor_match:
        vendor = vendor_match.group(1)
        namespaces = [vendor]
    else:
        namespaces = DEFAULT_NAMESPACES

    files = subprocess.check_output(['git', '-C', repo, 'ls-files', '*.fidl'])

    has_errors = False
    for file in files.splitlines():
        if any(file.startswith(ignored) for ignored in IGNORED_DIRS):
          continue
        elif file.endswith('test.fidl'):
          continue

        with open(os.path.join(repo, file), 'r') as fidl:
            contents = fidl.read()
            result = re.search(r'^library ([^\.;]+)[^;]*;$', contents,
                               re.MULTILINE)
            if not result:
                print('Missing library declaration (%s)' % file)
                has_errors = True
                continue
            namespace = result.group(1)
            if namespace not in namespaces:
                print(
                    'Invalid namespace %s (%s), namespace must begin with one of [%s].'
                    % (namespace, file, ', '.join(namespaces)))
                has_errors = True

    return 1 if has_errors else 0


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