import subprocess
import sys
import logging
from logging import info, error
import os

BIN_DIR = "bin/tests/logging/"


def run_check_output():
    info("started check output...")

    p = subprocess.run(BIN_DIR + "output", capture_output=True, text=True)

    info("checking exit code...")

    # check exit code
    assert p.returncode == 0

    output = p.stderr

    # check if logs appear in default log output (stderr)
    info("checking stderr...")

    assert "logging some debug..." in output
    assert "logging some info..." in output
    assert "logging some warning..." in output
    assert "logging some error..." in output


def run_check_level():
    info("started check level...")

    p = subprocess.run(BIN_DIR + "level", capture_output=True, text=True)

    info("checking exit code...")

    # check exit code
    assert p.returncode == 0

    output = p.stderr

    # check if logs appear in default log output (stderr)
    info("checking stderr...")

    assert "logging some debug..." not in output
    assert "logging some info..." not in output
    assert "logging some warning..." in output
    assert "logging some error..." in output


def run_check_panic():
    info("started check panic...")

    p = subprocess.run(BIN_DIR + "panic", capture_output=True, text=True)

    info("checking exit code...")

    # check exit code
    assert p.returncode == 1

    output = p.stderr

    # check if logs appear (not) in default log output (stderr)
    info("checking stderr...")

    assert "before exit" in output
    assert "oooops something happened" in output
    assert "after exit" not in output


def run_check_stream():
    info("started check panic...")

    info("creating temporary folder...")

    if not os.path.exists("tmp"):
        os.mkdir("tmp")

    info("cleaning temporary folder...")

    if os.path.exists("tmp/test.log"):
        os.remove("tmp/test.log")

    info("launching test binary...")

    p = subprocess.run(BIN_DIR + "stream", capture_output=True, text=True)

    info("checking exit code...")

    # check exit code
    assert p.returncode == 0

    with open("tmp/test.log", "r") as file:
        assert "should be in both" in "".join(file.readlines())

    output = p.stderr

    # check if logs appear (not) in default log output (stderr)
    info("checking stderr...")

    assert "should only be in stderr" in output
    assert "should be in both" in output


if __name__ == "__main__":
    logging.basicConfig(level=logging.INFO)

    target = sys.argv[1]

    info(f"starting logging test suite with target: {target}")

    match target:
        case "check_output":
            run_check_output()
        case "check_panic":
            run_check_panic()
        case "check_stream":
            run_check_stream()
        case "check_level":
            run_check_level()
        case _:
            error(f"unknown target: {target}")
            exit(1)