from datetime import datetime, timedelta, timezone

from web_sentinel.license.license_manager import LicenceInfo
from web_sentinel.license.backends import requires_backend
from web_sentinel.license.runtime import _build_features_from_licence, _determine_alert_threshold
from web_sentinel.subscription.models import SubscriptionTier


def _make_info(
    tier: str,
    max_domains: int,
    max_users: int,
    features: dict[str, bool],
    valid_days: int = 90,
) -> LicenceInfo:
    return LicenceInfo(
        licence_id="TEST-001",
        tier=tier,
        max_users=max_users,
        max_domains=max_domains,
        valid_until=datetime.now(timezone.utc) + timedelta(days=valid_days),
        features=features,
        super_admin_email="admin@example.com",
        db_seed="seed",
        hardware_fingerprint=None,
        grace_period_hours=168,
        last_validation=None,
    )


def test_build_features_from_pro_licence_overrides_defaults():
    info = _make_info(
        tier="PRO",
        max_domains=25,
        max_users=12,
        features={"invasive_tests": True, "html_export": True},
    )

    features = _build_features_from_licence(info)

    assert features.tier == SubscriptionTier.PRO
    assert features.domain_limit == 25
    assert features.max_users == 12
    assert features.allow_invasive_tests is True
    assert features.allow_html_export is True
    assert features.allow_multi_user is False
    assert features.allow_api_access is False


def test_build_features_from_enterprise_plus_enables_all_flags():
    info = _make_info(
        tier="GOVERNMENT",
        max_domains=-1,
        max_users=200,
        features={
            "invasive_tests": True,
            "advanced_reports": True,
            "multi_user": True,
            "api_access": True,
        },
    )

    features = _build_features_from_licence(info)

    assert features.tier == SubscriptionTier.ENTERPRISE
    assert features.domain_limit == -1
    assert features.max_users == 200
    assert features.allow_invasive_tests is True
    assert features.allow_html_export is True  # via advanced_reports
    assert features.allow_multi_user is True
    assert features.allow_api_access is True


def test_determine_alert_threshold_matches_expected_brackets():
    assert _determine_alert_threshold(45) is None
    assert _determine_alert_threshold(29) == 30
    assert _determine_alert_threshold(6.5) == 7
    assert _determine_alert_threshold(0.5) == 1
    assert _determine_alert_threshold(-1) == 0


def test_requires_backend_for_standard_tiers():
    info = _make_info("PRO", -1, 10, features={})
    assert requires_backend(info) is True


def test_offline_tier_skips_backend():
    info = _make_info("GOVERNMENT", -1, 200, features={"air_gap": True})
    assert requires_backend(info) is False
