# Copyright (c) 2023 Google
#
# SPDX-License-Identifier: Apache-2.0

import argparse
import os
import sys

from west import log
from west.commands import WestCommand

from zephyr_ext_common import ZEPHYR_SCRIPTS

# Resolve path to twister libs and add imports
twister_path = ZEPHYR_SCRIPTS
os.environ["ZEPHYR_BASE"] = str(twister_path.parent)

sys.path.insert(0, str(twister_path))
sys.path.insert(0, str(twister_path / "pylib" / "twister"))

from twisterlib.environment import add_parse_arguments, parse_arguments
from twisterlib.twister_main import main

TWISTER_DESCRIPTION = """\
Convenience wrapper for twister. The below options are shared with the twister
script and have the same effects as if you ran twister directly. Refer to the
twister documentation for more information.
"""


class Twister(WestCommand):
    def __init__(self):
        super(Twister, self).__init__(
            "twister",
            # Keep this in sync with the string in west-commands.yml.
            "west twister wrapper",
            TWISTER_DESCRIPTION,
            accepts_unknown_args=True,
        )

    def do_add_parser(self, parser_adder):
        parser = parser_adder.add_parser(
            self.name,
            help=self.help,
            formatter_class=argparse.RawDescriptionHelpFormatter,
            description=self.description,
            allow_abbrev=False
        )

        parser = add_parse_arguments(parser)

        return parser

    def do_run(self, args, remainder):
        log.dbg(
            "args: {} remainder: {}".format(args, remainder), level=log.VERBOSE_EXTREME
        )

        options = self._parse_arguments(args=remainder, options=args)
        main(options)

    def _parse_arguments(self, args, options):
        """Helper function for testing purposes"""
        return parse_arguments(self.parser, args, options)
