#!/usr/bin/env python3
#
# Copyright (c) 2022 Kumar Gala <galak@kernel.org>
#
# SPDX-License-Identifier: Apache-2.0

import argparse
import os
import sys
import re

import yaml
try:
    # Use the C LibYAML parser if available, rather than the Python parser.
    from yaml import CLoader as Loader
except ImportError:
    from yaml import Loader     # type: ignore

sys.path.insert(0, os.path.join(os.path.dirname(__file__), 'python-devicetree',
                                'src'))

def binding_paths(bindings_dirs):
    # Returns a list with the paths to all bindings (.yaml files) in
    # 'bindings_dirs'

    binding_paths = []

    for bindings_dir in bindings_dirs:
        for root, _, filenames in os.walk(bindings_dir):
            for filename in filenames:
                if filename.endswith(".yaml") or filename.endswith(".yml"):
                    binding_paths.append(os.path.join(root, filename))

    return binding_paths

def parse_args():
    # Returns parsed command-line arguments

    parser = argparse.ArgumentParser()
    parser.add_argument("--kconfig-out", required=True,
                        help="path to write the Kconfig file")
    parser.add_argument("--bindings-dirs", nargs='+', required=True,
                        help="directory with bindings in YAML format, "
                        "we allow multiple")

    return parser.parse_args()

def printfile(s):
    print(s, file=kconfig_file)

def str2ident(s):
    # Converts 's' to a form suitable for (part of) an identifier

    return re.sub('[-,.@/+]', '_', s.upper())

def compat2kconfig(compat):
    compat_ident = str2ident(compat)

    printfile(f'')
    printfile(f'DT_COMPAT_{compat_ident} := {compat}')
    printfile(f'')
    printfile(f'config DT_HAS_{compat_ident}_ENABLED')
    printfile(f'\tdef_bool $(dt_compat_enabled,$(DT_COMPAT_{compat_ident}))')

def main():
    global kconfig_file
    args = parse_args()

    compat_list = []

    for binding_path in binding_paths(args.bindings_dirs):
        with open(binding_path, encoding="utf-8") as f:
            contents = f.read()

            try:
                # Parsed PyYAML output (Python lists/dictionaries/strings/etc.,
                # representing the file)
                raw = yaml.load(contents, Loader=Loader)
            except yaml.YAMLError as e:
                print(f"WARNING: '{binding_path}' appears in binding "
                      f"directories but isn't valid YAML: {e}")
                continue
        if 'compatible' not in raw:
            continue

        compat_list.append(raw['compatible'])

    # Remove any duplicates and sort the list
    compat_list = sorted(set(compat_list))

    with open(args.kconfig_out, "w", encoding="utf-8") as kconfig_file:
        printfile(f'# Generated devicetree Kconfig')
        printfile(f'#')
        printfile(f'# SPDX-License-Identifier: Apache-2.0')

        for c in compat_list:
            compat2kconfig(c)


if __name__ == "__main__":
    main()
