import pytest
from aiva.email.throttle_config import ThrottleConfig
from aiva.email.throttle_config import load_throttle_config


def test_throttle_config_creation():
    config = ThrottleConfig(rate=100, period=60, burst_size=200)
    assert config.rate == 100
    assert config.period == 60
    assert config.burst_size == 200


def test_throttle_config_repr():
    config = ThrottleConfig(rate=100, period=60, burst_size=200)
    assert repr(config) == "ThrottleConfig(rate=100, period=60, burst_size=200)"


def test_load_throttle_config_valid_config():
    config_data = {
        "example.com": {
            "rate": 50,
            "period": 30,
            "burst_size": 100
        },
        "gmail.com": {
            "rate": 100,
            "period": 60,
            "burst_size": 200
        }
    }
    config = load_throttle_config(config_data)
    assert config["example.com"].rate == 50
    assert config["example.com"].period == 30
    assert config["example.com"].burst_size == 100
    assert config["gmail.com"].rate == 100
    assert config["gmail.com"].period == 60
    assert config["gmail.com"].burst_size == 200


def test_load_throttle_config_empty_config():
    config_data = {}
    config = load_throttle_config(config_data)
    assert config == {}


def test_load_throttle_config_invalid_config_missing_rate():
    config_data = {
        "example.com": {
            "period": 30,
            "burst_size": 100
        }
    }
    with pytest.raises(ValueError):
        load_throttle_config(config_data)


def test_load_throttle_config_invalid_config_missing_period():
    config_data = {
        "example.com": {
            "rate": 50,
            "burst_size": 100
        }
    }
    with pytest.raises(ValueError):
        load_throttle_config(config_data)


def test_load_throttle_config_invalid_config_missing_burst_size():
    config_data = {
        "example.com": {
            "rate": 50,
            "period": 30,
        }
    }
    with pytest.raises(ValueError):
        load_throttle_config(config_data)


def test_load_throttle_config_invalid_config_invalid_rate():
    config_data = {
        "example.com": {
            "rate": "invalid",
            "period": 30,
            "burst_size": 100
        }
    }
    with pytest.raises(ValueError):
        load_throttle_config(config_data)


def test_load_throttle_config_invalid_config_invalid_period():
    config_data = {
        "example.com": {
            "rate": 50,
            "period": "invalid",
            "burst_size": 100
        }
    }
    with pytest.raises(ValueError):
        load_throttle_config(config_data)


def test_load_throttle_config_invalid_config_invalid_burst_size():
    config_data = {
        "example.com": {
            "rate": 50,
            "period": 30,
            "burst_size": "invalid"
        }
    }
    with pytest.raises(ValueError):
        load_throttle_config(config_data)
