"""Tests for config.py."""

import json
from pathlib import Path
from unittest.mock import patch

import pytest

from modpack_checker.config import Config


def test_default_values():
    cfg = Config()
    assert cfg.curseforge_api_key == ""
    assert cfg.discord_webhook_url is None
    assert cfg.check_interval_hours == 6
    assert cfg.notification_on_update is True


def test_is_configured_without_key():
    assert Config().is_configured() is False


def test_is_configured_with_key():
    assert Config(curseforge_api_key="abc123").is_configured() is True


def test_save_and_load_round_trip(tmp_path):
    config_dir = tmp_path / ".config" / "modpack-checker"
    config_file = config_dir / "config.json"

    with patch("modpack_checker.config.CONFIG_DIR", config_dir), \
         patch("modpack_checker.config.CONFIG_FILE", config_file):
        original = Config(
            curseforge_api_key="test-key-xyz",
            check_interval_hours=12,
            notification_on_update=False,
        )
        original.save()

        loaded = Config.load()

    assert loaded.curseforge_api_key == "test-key-xyz"
    assert loaded.check_interval_hours == 12
    assert loaded.notification_on_update is False


def test_load_returns_defaults_when_file_missing(tmp_path):
    config_file = tmp_path / "nonexistent.json"
    with patch("modpack_checker.config.CONFIG_FILE", config_file):
        cfg = Config.load()
    assert cfg.curseforge_api_key == ""


def test_load_returns_defaults_on_corrupted_file(tmp_path):
    config_dir = tmp_path / ".config" / "modpack-checker"
    config_dir.mkdir(parents=True)
    config_file = config_dir / "config.json"
    config_file.write_text("{ this is not valid json }")

    with patch("modpack_checker.config.CONFIG_DIR", config_dir), \
         patch("modpack_checker.config.CONFIG_FILE", config_file):
        cfg = Config.load()

    assert cfg.curseforge_api_key == ""


def test_interval_bounds():
    with pytest.raises(Exception):
        Config(check_interval_hours=0)
    with pytest.raises(Exception):
        Config(check_interval_hours=169)
