from __future__ import annotations

"""Data structures describing subscription tiers and their capabilities."""

from dataclasses import dataclass
from enum import Enum
from typing import Dict


class SubscriptionTier(str, Enum):
    """Supported subscription tiers."""

    FREE = "free"
    STARTER = "starter"
    PRO = "pro"
    ENTERPRISE = "enterprise"
    SYSOP = "sysop"  # Special developer/admin tier with unlimited access


@dataclass(frozen=True)
class SubscriptionFeatures:
    """Feature flags associated with a subscription tier."""

    tier: SubscriptionTier
    domain_limit: int
    max_users: int
    allow_invasive_tests: bool
    allow_html_export: bool
    allow_multi_user: bool
    allow_api_access: bool
    
    # SAST (Static Application Security Testing) permissions
    allow_source_scan: bool = False
    max_source_files: int = 0
    max_source_size_mb: int = 0
    advanced_rules: bool = False


_FEATURE_MATRIX: Dict[SubscriptionTier, SubscriptionFeatures] = {
    SubscriptionTier.FREE: SubscriptionFeatures(
        tier=SubscriptionTier.FREE,
        domain_limit=5,  # 5 domaines max pour découverte
        max_users=0,     # Anonyme (pas de compte)
        allow_invasive_tests=False,
        allow_html_export=False,
        allow_multi_user=False,
        allow_api_access=False,
        # SAST not available for FREE tier
        allow_source_scan=False,
        max_source_files=0,
        max_source_size_mb=0,
        advanced_rules=False,
    ),
    SubscriptionTier.STARTER: SubscriptionFeatures(
        tier=SubscriptionTier.STARTER,
        domain_limit=-1,  # Unlimited DNS scans
        max_users=1,
        allow_invasive_tests=False,
        allow_html_export=True,  # Export HTML activé
        allow_multi_user=False,
        allow_api_access=False,  # Pas d'API pour STARTER
        # SAST limité pour motivation upgrade
        allow_source_scan=True,
        max_source_files=10,     # 10 fichiers/mois
        max_source_size_mb=10,   # 10 MB max
        advanced_rules=False,
    ),
    SubscriptionTier.PRO: SubscriptionFeatures(
        tier=SubscriptionTier.PRO,
        domain_limit=-1,  # Unlimited
        max_users=1,      # Mono-utilisateur (pas de collègues)
        allow_invasive_tests=True,
        allow_html_export=True,
        allow_multi_user=False,  # Pas de multi-user pour PRO
        allow_api_access=True,   # API activé pour CI/CD
        # SAST basic for PRO tier - 100 fichiers par mois
        allow_source_scan=True,
        max_source_files=100,
        max_source_size_mb=50,   # 50 MB (était 20)
        advanced_rules=False,
    ),
    SubscriptionTier.ENTERPRISE: SubscriptionFeatures(
        tier=SubscriptionTier.ENTERPRISE,
        domain_limit=-1,
        max_users=10,     # 10 utilisateurs max (était 50)
        allow_invasive_tests=True,
        allow_html_export=True,
        allow_multi_user=True,
        allow_api_access=True,
        # SAST advanced for ENTERPRISE tier - 500 fichiers par mois
        allow_source_scan=True,
        max_source_files=500,
        max_source_size_mb=200,  # 200 MB (était 100)
        advanced_rules=True,
    ),
    SubscriptionTier.SYSOP: SubscriptionFeatures(
        tier=SubscriptionTier.SYSOP,
        domain_limit=-1,  # Unlimited
        max_users=-1,     # Unlimited users
        allow_invasive_tests=True,
        allow_html_export=True,
        allow_multi_user=True,
        allow_api_access=True,
        # SAST unlimited for SYSOP tier
        allow_source_scan=True,
        max_source_files=-1,  # Unlimited
        max_source_size_mb=-1,  # Unlimited
        advanced_rules=True,
    ),
}


def get_features_for_tier(tier: SubscriptionTier) -> SubscriptionFeatures:
    """Return the feature set associated with a tier."""
    try:
        return _FEATURE_MATRIX[tier]
    except KeyError as exc:  # pragma: no cover - defensive guard
        raise ValueError(f"Unsupported subscription tier: {tier}") from exc
