# Copyright (c) 2021 The ZMK Contributors
# SPDX-License-Identifier: MIT
'''Metadata command for ZMK.'''

from functools import cached_property
import glob
import json
from jsonschema import validate, ValidationError
import os
import sys
import yaml
from textwrap import dedent            # just for nicer code indentation

from west.commands import WestCommand
from west import log                   # use this for user output


class Metadata(WestCommand):
    def __init__(self):
        super().__init__(
            'metadata',  # gets stored as self.name
            'ZMK hardware metadata commands',  # self.help
            # self.description:
            dedent('''Operate on the board/shield metadata.'''))

    def do_add_parser(self, parser_adder):
        parser = parser_adder.add_parser(self.name,
                                         help=self.help,
                                         description=self.description)

        parser.add_argument('subcommand', default="check",
                            help='The subcommand to run. Defaults to "check".', nargs="?")
        return parser           # gets stored as self.parser

    @cached_property
    def schema(self):
        return json.load(
            open("../schema/hardware-metadata.schema.json", 'r'))

    def validate_file(self, file):
        print("Validating: " + file)
        with open(file, 'r') as stream:
            try:
                validate(yaml.safe_load(stream), self.schema)
            except yaml.YAMLError as exc:
                print("Failed loading metadata yaml: " + file)
                print(exc)
                return False
            except ValidationError as vexc:
                print("Failed validation of: " + file)
                print(vexc)
                return False
        return True

    def do_run(self, args, unknown_args):
        status = all([self.validate_file(f) for f in glob.glob(
            "boards/**/*.zmk.yml", recursive=True)])

        sys.exit(0 if status else 1)