"""TOSA test runner module for the Reference Model."""
# Copyright (c) 2020-2022, ARM Limited.
# SPDX-License-Identifier: Apache-2.0
from enum import IntEnum
from enum import unique

from runner.run_command import run_sh_command
from runner.run_command import RunShCommandError
from runner.tosa_test_runner import TosaTestRunner


@unique
class TosaRefReturnCode(IntEnum):
    """Return codes from the Tosa Reference Model."""

    VALID = 0
    UNPREDICTABLE = 1
    ERROR = 2


class TosaSUTRunner(TosaTestRunner):
    """TOSA Reference Model runner."""

    def __init__(self, args, runnerArgs, testDirPath):
        """Initialize using the given test details."""
        super().__init__(args, runnerArgs, testDirPath)

    def runTestGraph(self):
        """Run the test on the reference model."""
        # Build up the TOSA reference command line
        # Uses arguments from the argParser args, not the runnerArgs
        args = self.args

        # Call Reference model with description file to provide all file details
        cmd = [
            args.ref_model_path,
            "--tosa_level={}".format(args.tosa_level),
            "--operator_fbs={}".format(args.operator_fbs),
            "--test_desc={}".format(self.descFile),
        ]

        # Specific debug options for reference model
        if args.ref_debug:
            cmd.extend(["-d", "ALL", "-l", args.ref_debug])

        if args.ref_intermediates:
            cmd.extend(["--dump_intermediates", str(args.ref_intermediates)])

        if args.precise_mode:
            cmd.extend(["--precise_mode=1"])

        # Run command and interpret tosa graph result via process return codes
        graphMessage = None
        try:
            run_sh_command(cmd, self.args.verbose, capture_output=True)
            graphResult = TosaTestRunner.TosaGraphResult.TOSA_VALID
        except RunShCommandError as e:
            graphMessage = e.stderr
            if e.return_code == TosaRefReturnCode.ERROR:
                graphResult = TosaTestRunner.TosaGraphResult.TOSA_ERROR
            elif e.return_code == TosaRefReturnCode.UNPREDICTABLE:
                graphResult = TosaTestRunner.TosaGraphResult.TOSA_UNPREDICTABLE
            else:
                graphResult = TosaTestRunner.TosaGraphResult.OTHER_ERROR
                if not self.args.verbose:
                    print(e)
        except Exception as e:
            print(e)
            graphMessage = str(e)
            graphResult = TosaTestRunner.TosaGraphResult.OTHER_ERROR

        # Return graph result and message
        return graphResult, graphMessage
