#
#    Copyright (c) 2021 Project CHIP Authors
#
#    Licensed under the Apache License, Version 2.0 (the "License");
#    you may not use this file except in compliance with the License.
#    You may obtain a copy of the License at
#
#        http://www.apache.org/licenses/LICENSE-2.0
#
#    Unless required by applicable law or agreed to in writing, software
#    distributed under the License is distributed on an "AS IS" BASIS,
#    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
#    See the License for the specific language governing permissions and
#    limitations under the License.
#

import os
import subprocess
from pathlib import Path

from . import linux, runner
from .test_definition import ApplicationPaths, TestDefinition, TestTarget

_DEFAULT_CHIP_ROOT = os.path.abspath(
    os.path.join(os.path.dirname(__file__), "..", "..", ".."))
_YAML_TEST_SUITE_PATH = os.path.abspath(
    os.path.join(_DEFAULT_CHIP_ROOT, "src/app/tests/suites"))


def _FindYamlTestPath(name: str):
    yaml_test_suite_path = Path(_YAML_TEST_SUITE_PATH)
    if not yaml_test_suite_path.exists():
        raise FileNotFoundError(f"Expected directory {_YAML_TEST_SUITE_PATH} to exist")
    for path in yaml_test_suite_path.rglob(name):
        if not path.is_file():
            continue
        if path.name != name:
            continue
        return str(path)
    return None


def target_for_name(name: str):
    if name.startswith("TV_") or name.startswith("Test_TC_MC_") or name.startswith("Test_TC_LOWPOWER_") or name.startswith("Test_TC_KEYPADINPUT_") or name.startswith("Test_TC_APPLAUNCHER_") or name.startswith("Test_TC_MEDIAINPUT_") or name.startswith("Test_TC_WAKEONLAN_") or name.startswith("Test_TC_CHANNEL_") or name.startswith("Test_TC_MEDIAPLAYBACK_") or name.startswith("Test_TC_AUDIOOUTPUT_") or name.startswith("Test_TC_TGTNAV_") or name.startswith("Test_TC_APBSC_") or name.startswith("Test_TC_CONTENTLAUNCHER_") or name.startswith("Test_TC_ALOGIN_"):
        return TestTarget.TV
    if name.startswith("DL_") or name.startswith("Test_TC_DRLK_"):
        return TestTarget.LOCK
    if name.startswith("OTA_"):
        return TestTarget.OTA
    if name.startswith("Test_TC_BRBINFO_"):
        return TestTarget.BRIDGE
    return TestTarget.ALL_CLUSTERS


def tests_with_command(chip_tool: str, is_manual: bool):
    """Executes `chip_tool` binary to see what tests are available, using cmd
    to get the list.
    """
    cmd = "list"
    if is_manual:
        cmd += "-manual"

    result = subprocess.run([chip_tool, "tests", cmd], capture_output=True)

    for name in result.stdout.decode("utf8").split("\n"):
        if not name:
            continue

        target = target_for_name(name)

        yield TestDefinition(
            run_name=name, name=name, target=target, is_manual=is_manual
        )


# TODO We will move away from hardcoded list of yamltests to run all file when yamltests
# parser/runner reaches parity with the code gen version.
def _hardcoded_python_yaml_tests():
    currently_supported_yaml_tests = [
        "Test_TC_ACL_1_1.yaml",
        "Test_TC_ACL_2_1.yaml",
        "Test_TC_BOOL_1_1.yaml",
        "Test_TC_ACT_1_1.yaml",
        "Test_TC_BIND_1_1.yaml",
        "Test_TC_OPCREDS_1_2.yaml",
        "Test_TC_BINFO_1_1.yaml",
        "Test_TC_DESC_1_1.yaml",
        "Test_TC_DLOG_1_1.yaml",
        "Test_TC_FLW_1_1.yaml",
        "Test_TC_FLW_2_1.yaml",
        "Test_TC_FLABEL_1_1.yaml",
        "Test_TC_CGEN_1_1.yaml",
        "Test_TC_DGGEN_1_1.yaml",
        "Test_TC_I_1_1.yaml",
        "Test_TC_I_2_1.yaml",
        "Test_TC_ILL_1_1.yaml",
        "Test_TC_ILL_2_1.yaml",
        "Test_TC_LVL_2_1.yaml",
        "Test_TC_LVL_2_2.yaml",
        "Test_TC_LCFG_1_1.yaml",
        "Test_TC_LTIME_1_2.yaml",
        "Test_TC_LOWPOWER_1_1.yaml",
        "Test_TC_WAKEONLAN_1_5.yaml",
        "Test_TC_AUDIOOUTPUT_1_8.yaml",
        "Test_TC_TGTNAV_1_9.yaml",
        "Test_TC_TGTNAV_8_2.yaml",
        "Test_TC_APBSC_1_10.yaml",
        "Test_TC_ALOGIN_1_12.yaml",
        "Test_TC_KEYPADINPUT_3_2.yaml",
        "Test_TC_KEYPADINPUT_3_3.yaml",
        "Test_TC_APPLAUNCHER_3_5.yaml",
        "Test_TC_APPLAUNCHER_3_6.yaml",
        "Test_TC_MEDIAINPUT_3_10.yaml",
        "Test_TC_MEDIAINPUT_3_11.yaml",
        "Test_TC_CHANNEL_5_1.yaml",
        "Test_TC_CONTENTLAUNCHER_10_1.yaml",
        "Test_TC_OCC_1_1.yaml",
        "Test_TC_PSCFG_1_1.yaml",
        "Test_TC_PSCFG_2_1.yaml",
        "Test_TC_RH_1_1.yaml",
        "Test_TC_RH_2_1.yaml",
        "Test_TC_SWTCH_2_1.yaml",
        "Test_TC_TMP_1_1.yaml",
        "Test_TC_TMP_2_1.yaml",
        "Test_TC_TSUIC_1_1.yaml",
        "Test_TC_TSUIC_2_1.yaml",
        "Test_TC_DGTHREAD_2_2.yaml",
        "Test_TC_DGTHREAD_2_4.yaml",
        "Test_TC_ULABEL_1_1.yaml",
        "Test_TC_ULABEL_2_1.yaml",
        "Test_TC_ULABEL_2_2.yaml",
        "Test_TC_ULABEL_2_3.yaml",
        "Test_TC_ULABEL_2_4.yaml",
        "Test_TC_DGWIFI_2_3.yaml",
        "TV_TargetNavigatorCluster.yaml",
        "TV_AudioOutputCluster.yaml",
        "TV_ApplicationLauncherCluster.yaml",
        "TV_KeypadInputCluster.yaml",
        "TV_AccountLoginCluster.yaml",
        "TV_WakeOnLanCluster.yaml",
        "TV_ApplicationBasicCluster.yaml",
        "TV_ChannelCluster.yaml",
        "TV_LowPowerCluster.yaml",
        "TV_ContentLauncherCluster.yaml",
        "TV_MediaInputCluster.yaml",
        "TestCluster.yaml",
        "TestConstraints.yaml",
        "TestSaveAs.yaml",
        "TestConfigVariables.yaml",
        "TestFabricRemovalWhileSubscribed.yaml",
        "TestIdentifyCluster.yaml",
        "TestSelfFabricRemoval.yaml",
        "TestBinding.yaml",
        "TestUserLabelClusterConstraints.yaml",
        "TestFanControl.yaml",
        "TestAccessControlConstraints.yaml",
        "TestCommissioningWindow.yaml",
        "TestSubscribe_OnOff.yaml",
        "TestClusterComplexTypes.yaml",
        "TestGroupsCluster.yaml",
        "TestOperationalCredentialsCluster.yaml",
        "Test_TC_AUDIOOUTPUT_7_1.yaml",
        "Test_TC_BOOL_2_1.yaml",
        "Test_TC_OO_2_1.yaml",
        "Test_TC_TGTNAV_8_1.yaml",
        "Test_TC_WNCV_2_3.yaml",
        "Test_TC_WNCV_4_3.yaml",
        "Test_TC_WNCV_4_4.yaml",
        "DL_Schedules.yaml",
        "DL_UsersAndCredentials.yaml",
    ]

    for name in currently_supported_yaml_tests:
        yaml_test_path = _FindYamlTestPath(name)
        if not yaml_test_path:
            raise FileNotFoundError(f"Could not find YAML test {name}")

        target = target_for_name(name)

        yield TestDefinition(
            run_name=yaml_test_path, name=name, target=target, is_manual=False, use_chip_repl_yaml_tester=True
        )


def AllTests(chip_tool: str, run_yamltests_with_chip_repl: bool):
    if run_yamltests_with_chip_repl:
        for test in _hardcoded_python_yaml_tests():
            yield test
        return

    for test in tests_with_command(chip_tool, is_manual=False):
        yield test

    for test in tests_with_command(chip_tool, is_manual=True):
        yield test


__all__ = [
    "TestTarget",
    "TestDefinition",
    "AllTests",
    "ApplicationPaths",
    "linux",
    "runner",
]
