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

from functools import cached_property
import glob
import json
import jsonschema
import sys
import yaml

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


class Metadata(WestCommand):
    def __init__(self):
        super().__init__(
            name="metadata",
            help="ZMK hardware metadata commands",
            description="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:
                jsonschema.validate(yaml.safe_load(stream), self.schema)
            except yaml.YAMLError as exc:
                print("Failed loading metadata yaml: " + file)
                print(exc)
                return False
            except jsonschema.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)
