import sys
import pytest

from auto_archiver.__main__ import main


@pytest.fixture
def orchestration_file_path(tmp_path):
    folder = tmp_path / "secrets"
    folder.mkdir(exist_ok=True)
    return (folder / "example_orch.yaml").as_posix()


@pytest.fixture
def orchestration_file(orchestration_file_path):
    def _orchestration_file(content=""):
        with open(orchestration_file_path, "w") as f:
            f.write(content)
        return orchestration_file_path

    return _orchestration_file


@pytest.fixture
def autoarchiver(tmp_path, monkeypatch, request):
    def _autoarchiver(args=[]):
        def cleanup():
            from loguru import logger

            if not logger._core.handlers.get(0):
                logger._core.handlers_count = 0
                logger.add(sys.stderr)

        request.addfinalizer(cleanup)
        (tmp_path / "secrets").mkdir(exist_ok=True)

        # change dir to tmp_path
        monkeypatch.chdir(tmp_path)
        with monkeypatch.context() as m:
            m.setattr(sys, "argv", ["auto-archiver"] + args)
            return main()

    return _autoarchiver


def test_run_auto_archiver_no_args(caplog, autoarchiver):
    with pytest.raises(SystemExit):
        autoarchiver()
    assert "provide at least one URL via the command line, or set up an alternative feeder" in caplog.text


def test_run_auto_archiver_invalid_file(caplog, autoarchiver):
    # exec 'auto-archiver' on the command lin
    with pytest.raises(SystemExit):
        autoarchiver(["--config", "nonexistent_file.yaml"])

    assert "Make sure the file exists and try again, or run without th" in caplog.text


def test_run_auto_archiver_empty_file(caplog, autoarchiver, orchestration_file):
    # create a valid (empty) orchestration file
    path = orchestration_file(content="")
    # exec 'auto-archiver' on the command lin
    with pytest.raises(SystemExit):
        autoarchiver(["--config", path])

    # should treat an empty file as if there is no file at all
    assert " No URLs provided. Please provide at least one URL via the com" in caplog.text


def test_call_autoarchiver_main(caplog, monkeypatch, tmp_path):
    from auto_archiver.__main__ import main

    # monkey patch to change the current working directory, so that we don't use the user's real config file
    monkeypatch.chdir(tmp_path)
    (tmp_path / "secrets").mkdir(exist_ok=True)
    with monkeypatch.context() as m:
        m.setattr(sys, "argv", ["auto-archiver"])
        with pytest.raises(SystemExit):
            main()

    assert "No URLs provided. Please provide at least one" in caplog.text
