import os
import pathlib
import tempfile

from platformdirs import user_data_dir
from reader import Reader
from tomlkit import TOMLDocument

from discord_rss_bot.settings import create_settings_file, data_dir, get_db_location, get_reader, read_settings_file


def test_read_settings_file():
    """Test reading the settings file."""
    with tempfile.TemporaryDirectory() as temp_dir:
        custom_loc = os.path.join(temp_dir, "test_settings.toml")

        # File should not exist yet should this should fail.
        assert not os.path.exists(custom_loc)

        # Create the file.
        settings: TOMLDocument = read_settings_file(custom_location=custom_loc)

        # Check if the settings file is a toml document.
        assert isinstance(settings, TOMLDocument)

        # Check if file exists
        assert os.path.exists(os.path.join(temp_dir, "test_settings.toml"))

        # Check if the file has the correct contents
        assert settings["webhooks"] == {}
        assert settings["database"] == {}


def test_get_db_location():
    """Test getting the database location."""
    with tempfile.TemporaryDirectory() as temp_dir:
        custom_loc = os.path.join(temp_dir, "test_db.sqlite")

        # File should not exist yet.
        assert not os.path.exists(custom_loc)

        # Create the file and check if it exists.
        assert get_db_location(custom_location=custom_loc) == os.path.join(temp_dir, "test_db.sqlite")

        # Test with the default location
        loc = user_data_dir(appname="discord_rss_bot", appauthor="TheLovinator", roaming=True)
        assert get_db_location() == os.path.join(loc, "db.sqlite")


def test_reader():
    """Test the reader."""
    reader = get_reader()
    assert isinstance(reader, Reader)

    # Test the reader with a custom location.
    with tempfile.TemporaryDirectory() as temp_dir:
        # Create the temp directory
        os.makedirs(temp_dir, exist_ok=True)

        custom_loc = pathlib.Path(temp_dir, "custom_loc_db.sqlite")
        custom_reader = get_reader(custom_location=str(custom_loc))
        assert isinstance(custom_reader, Reader)

        # Close the reader, so we can delete the directory.
        custom_reader.close()


def test_create_settings_file():
    """Test creating the settings file."""
    with tempfile.TemporaryDirectory() as temp_dir:
        settings_file_location: str = os.path.join(temp_dir, "settings.toml")

        # File should not exist yet.
        assert not os.path.exists(settings_file_location)

        # Create the file and check if it exists.
        create_settings_file(settings_file_location)
        assert os.path.exists(settings_file_location)


def test_data_dir():
    """Test the data directory."""
    assert os.path.exists(data_dir)