# SPDX-License-Identifier: GPL-2.0

import sys
from pathlib import Path
from .consts import KSRC, KSFT_DIR
from .ksft import ksft_pr, ktap_result

# Resolve paths
try:
    if (KSFT_DIR / "kselftest-list.txt").exists():
        # Running in "installed" selftests
        tools_full_path = KSFT_DIR
        SPEC_PATH = KSFT_DIR / "net/lib/specs"

        sys.path.append(tools_full_path.as_posix())
        from net.lib.ynl.pyynl.lib import YnlFamily, NlError, NlPolicy, Netlink
    else:
        # Running in tree
        tools_full_path = KSRC / "tools"
        SPEC_PATH = KSRC / "Documentation/netlink/specs"

        sys.path.append(tools_full_path.as_posix())
        from net.ynl.pyynl.lib import YnlFamily, NlError, NlPolicy, Netlink
except ModuleNotFoundError as e:
    ksft_pr("Failed importing `ynl` library from kernel sources")
    ksft_pr(str(e))
    ktap_result(True, comment="SKIP")
    sys.exit(4)

__all__ = [
    "NlError", "NlPolicy", "Netlink", "YnlFamily", "SPEC_PATH",
    "EthtoolFamily", "RtnlFamily", "RtnlAddrFamily", "RtnlRouteFamily",
    "NetdevFamily", "NetshaperFamily", "NlctrlFamily", "DevlinkFamily",
    "PSPFamily",
]

#
# Wrapper classes, loading the right specs
# Set schema='' to avoid jsonschema validation, it's slow
#
class EthtoolFamily(YnlFamily):
    def __init__(self, recv_size=0):
        super().__init__((SPEC_PATH / Path('ethtool.yaml')).as_posix(),
                         schema='', recv_size=recv_size)


class RtnlFamily(YnlFamily):
    def __init__(self, recv_size=0):
        super().__init__((SPEC_PATH / Path('rt-link.yaml')).as_posix(),
                         schema='', recv_size=recv_size)

class RtnlAddrFamily(YnlFamily):
    def __init__(self, recv_size=0):
        super().__init__((SPEC_PATH / Path('rt-addr.yaml')).as_posix(),
                         schema='', recv_size=recv_size)

class RtnlRouteFamily(YnlFamily):
    def __init__(self, recv_size=0):
        super().__init__((SPEC_PATH / Path('rt-route.yaml')).as_posix(),
                         schema='', recv_size=recv_size)

class NetdevFamily(YnlFamily):
    def __init__(self, recv_size=0):
        super().__init__((SPEC_PATH / Path('netdev.yaml')).as_posix(),
                         schema='', recv_size=recv_size)

class NetshaperFamily(YnlFamily):
    def __init__(self, recv_size=0):
        super().__init__((SPEC_PATH / Path('net_shaper.yaml')).as_posix(),
                         schema='', recv_size=recv_size)


class NlctrlFamily(YnlFamily):
    def __init__(self, recv_size=0):
        super().__init__((SPEC_PATH / Path('nlctrl.yaml')).as_posix(),
                         schema='', recv_size=recv_size)


class DevlinkFamily(YnlFamily):
    def __init__(self, recv_size=0):
        super().__init__((SPEC_PATH / Path('devlink.yaml')).as_posix(),
                         schema='', recv_size=recv_size)

class PSPFamily(YnlFamily):
    def __init__(self, recv_size=0):
        super().__init__((SPEC_PATH / Path('psp.yaml')).as_posix(),
                         schema='', recv_size=recv_size)
