# -*- coding: utf-8 -*-
"""
Analytics Constants
==================

Constants, enums, and configuration values for the Adtlas Analytics module.
Provides centralized definition of all constants used throughout the analytics
system for consistency and maintainability.

Constant Categories:
- Status Constants: Various status values
- Metric Constants: Performance and analytics metrics
- Time Constants: Time-related configurations
- Format Constants: Data format specifications
- Threshold Constants: Performance thresholds
- Error Constants: Error codes and messages
- Cache Constants: Caching configurations
- Export Constants: Export format specifications

Key Features:
- Centralized constant management
- Type-safe enum definitions
- Configuration value organization
- Documentation for all constants
- Easy maintenance and updates
- Import optimization
- Validation support
- Default value definitions

Usage Examples:
- Import specific constants: from .constants import ANALYTICS_STATUS
- Use in models: status = models.CharField(choices=ANALYTICS_STATUS.choices)
- Use in views: if status == ANALYTICS_STATUS.COMPLETED
- Use in serializers: default=DEFAULT_VALUES.CACHE_TIMEOUT

Author: Adtlas Development Team
Version: 1.0.0
Last Updated: 2024
"""

from enum import Enum
from typing import Dict, List, Tuple, Any, Optional


# =============================================================================
# STATUS CONSTANTS
# =============================================================================

class AnalyticsStatus(Enum):
    """
    Analytics processing status enumeration.
    
    Used for tracking the status of analytics data processing,
    report generation, and other analytics operations.
    """
    PENDING = 'pending'
    PROCESSING = 'processing'
    COMPLETED = 'completed'
    FAILED = 'failed'
    CANCELLED = 'cancelled'
    EXPIRED = 'expired'
    
    @classmethod
    def choices(cls):
        """Return choices for Django model fields."""
        return [(status.value, status.value.title()) for status in cls]
    
    @classmethod
    def values(cls):
        """Return list of status values."""
        return [status.value for status in cls]


class ReportStatus(Enum):
    """
    Report generation status enumeration.
    
    Used for tracking the status of analytics report generation
    and export operations.
    """
    QUEUED = 'queued'
    GENERATING = 'generating'
    READY = 'ready'
    DOWNLOADED = 'downloaded'
    ERROR = 'error'
    TIMEOUT = 'timeout'
    
    @classmethod
    def choices(cls):
        """Return choices for Django model fields."""
        return [(status.value, status.value.title()) for status in cls]


class DataQuality(Enum):
    """
    Data quality status enumeration.
    
    Used for indicating the quality and reliability
    of analytics data.
    """
    EXCELLENT = 'excellent'
    GOOD = 'good'
    FAIR = 'fair'
    POOR = 'poor'
    INVALID = 'invalid'
    
    @classmethod
    def choices(cls):
        """Return choices for Django model fields."""
        return [(quality.value, quality.value.title()) for quality in cls]


# =============================================================================
# METRIC CONSTANTS
# =============================================================================

class MetricType(Enum):
    """
    Analytics metric type enumeration.
    
    Defines the different types of metrics that can be
    tracked and analyzed in the system.
    """
    IMPRESSION = 'impression'
    CLICK = 'click'
    CONVERSION = 'conversion'
    VIEW = 'view'
    ENGAGEMENT = 'engagement'
    REVENUE = 'revenue'
    COST = 'cost'
    REACH = 'reach'
    FREQUENCY = 'frequency'
    COMPLETION = 'completion'
    
    @classmethod
    def choices(cls):
        """Return choices for Django model fields."""
        return [(metric.value, metric.value.title()) for metric in cls]


class MetricCategory(Enum):
    """
    Metric category enumeration.
    
    Categorizes metrics for better organization
    and reporting.
    """
    PERFORMANCE = 'performance'
    ENGAGEMENT = 'engagement'
    FINANCIAL = 'financial'
    TECHNICAL = 'technical'
    QUALITY = 'quality'
    USER_EXPERIENCE = 'user_experience'
    BUSINESS = 'business'
    OPERATIONAL = 'operational'
    
    @classmethod
    def choices(cls):
        """Return choices for Django model fields."""
        return [(category.value, category.value.replace('_', ' ').title()) for category in cls]


class AggregationType(Enum):
    """
    Data aggregation type enumeration.
    
    Defines how data should be aggregated for
    analytics and reporting purposes.
    """
    SUM = 'sum'
    AVERAGE = 'average'
    COUNT = 'count'
    MIN = 'min'
    MAX = 'max'
    MEDIAN = 'median'
    PERCENTILE = 'percentile'
    DISTINCT_COUNT = 'distinct_count'
    
    @classmethod
    def choices(cls):
        """Return choices for Django model fields."""
        return [(agg.value, agg.value.title()) for agg in cls]


# =============================================================================
# TIME CONSTANTS
# =============================================================================

class TimeGranularity(Enum):
    """
    Time granularity enumeration.
    
    Defines the time intervals for data aggregation
    and analysis.
    """
    MINUTE = 'minute'
    HOUR = 'hour'
    DAY = 'day'
    WEEK = 'week'
    MONTH = 'month'
    QUARTER = 'quarter'
    YEAR = 'year'
    
    @classmethod
    def choices(cls):
        """Return choices for Django model fields."""
        return [(granularity.value, granularity.value.title()) for granularity in cls]


class TimeSlot(Enum):
    """
    Time slot enumeration for broadcast analytics.
    
    Defines standard time slots for TV and media
    analytics and reporting.
    """
    EARLY_MORNING = 'early_morning'  # 00:00-06:00
    MORNING = 'morning'              # 06:00-12:00
    AFTERNOON = 'afternoon'          # 12:00-18:00
    EVENING = 'evening'              # 18:00-22:00
    PRIME_TIME = 'prime_time'        # 20:00-23:00
    LATE_NIGHT = 'late_night'        # 22:00-00:00
    
    @classmethod
    def choices(cls):
        """Return choices for Django model fields."""
        return [(slot.value, slot.value.replace('_', ' ').title()) for slot in cls]
    
    @classmethod
    def get_hour_range(cls, slot):
        """Get hour range for a time slot."""
        ranges = {
            cls.EARLY_MORNING: (0, 6),
            cls.MORNING: (6, 12),
            cls.AFTERNOON: (12, 18),
            cls.EVENING: (18, 22),
            cls.PRIME_TIME: (20, 23),
            cls.LATE_NIGHT: (22, 24),
        }
        return ranges.get(slot, (0, 24))


# Time-related constants
TIME_CONSTANTS = {
    'DEFAULT_TIMEZONE': 'UTC',
    'DATE_FORMAT': '%Y-%m-%d',
    'DATETIME_FORMAT': '%Y-%m-%d %H:%M:%S',
    'TIME_FORMAT': '%H:%M:%S',
    'CACHE_TIMEOUT': 300,  # 5 minutes
    'REAL_TIME_THRESHOLD': 60,  # 1 minute
    'DATA_RETENTION_DAYS': 365,  # 1 year
    'REPORT_TIMEOUT': 3600,  # 1 hour
}


# =============================================================================
# FORMAT CONSTANTS
# =============================================================================

class ExportFormat(Enum):
    """
    Export format enumeration.
    
    Defines supported formats for data export
    and report generation.
    """
    CSV = 'csv'
    EXCEL = 'excel'
    JSON = 'json'
    XML = 'xml'
    PDF = 'pdf'
    HTML = 'html'
    
    @classmethod
    def choices(cls):
        """Return choices for Django model fields."""
        return [(format.value, format.value.upper()) for format in cls]
    
    @classmethod
    def get_mime_type(cls, format_type):
        """Get MIME type for export format."""
        mime_types = {
            cls.CSV: 'text/csv',
            cls.EXCEL: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',
            cls.JSON: 'application/json',
            cls.XML: 'application/xml',
            cls.PDF: 'application/pdf',
            cls.HTML: 'text/html',
        }
        return mime_types.get(format_type, 'application/octet-stream')


class DataFormat(Enum):
    """
    Data format enumeration.
    
    Defines formats for data storage and
    transmission in the analytics system.
    """
    JSON = 'json'
    XML = 'xml'
    BINARY = 'binary'
    TEXT = 'text'
    COMPRESSED = 'compressed'
    
    @classmethod
    def choices(cls):
        """Return choices for Django model fields."""
        return [(format.value, format.value.upper()) for format in cls]


# =============================================================================
# THRESHOLD CONSTANTS
# =============================================================================

# Performance thresholds
PERFORMANCE_THRESHOLDS = {
    'RESPONSE_TIME_WARNING': 1000,  # milliseconds
    'RESPONSE_TIME_CRITICAL': 5000,  # milliseconds
    'ERROR_RATE_WARNING': 0.05,  # 5%
    'ERROR_RATE_CRITICAL': 0.10,  # 10%
    'CPU_USAGE_WARNING': 0.80,  # 80%
    'CPU_USAGE_CRITICAL': 0.95,  # 95%
    'MEMORY_USAGE_WARNING': 0.85,  # 85%
    'MEMORY_USAGE_CRITICAL': 0.95,  # 95%
    'DISK_USAGE_WARNING': 0.80,  # 80%
    'DISK_USAGE_CRITICAL': 0.90,  # 90%
}

# Analytics thresholds
ANALYTICS_THRESHOLDS = {
    'MIN_IMPRESSION_COUNT': 100,
    'MIN_CLICK_RATE': 0.01,  # 1%
    'MIN_CONVERSION_RATE': 0.005,  # 0.5%
    'MAX_BOUNCE_RATE': 0.70,  # 70%
    'MIN_ENGAGEMENT_TIME': 30,  # seconds
    'MIN_COMPLETION_RATE': 0.25,  # 25%
}

# Quality thresholds
QUALITY_THRESHOLDS = {
    'DATA_COMPLETENESS_EXCELLENT': 0.98,  # 98%
    'DATA_COMPLETENESS_GOOD': 0.90,  # 90%
    'DATA_COMPLETENESS_FAIR': 0.75,  # 75%
    'DATA_ACCURACY_EXCELLENT': 0.99,  # 99%
    'DATA_ACCURACY_GOOD': 0.95,  # 95%
    'DATA_ACCURACY_FAIR': 0.85,  # 85%
}


# =============================================================================
# ERROR CONSTANTS
# =============================================================================

class ErrorCode(Enum):
    """
    Error code enumeration.
    
    Defines standard error codes for the analytics
    system for consistent error handling.
    """
    # General errors
    UNKNOWN_ERROR = 'E001'
    VALIDATION_ERROR = 'E002'
    PERMISSION_ERROR = 'E003'
    AUTHENTICATION_ERROR = 'E004'
    
    # Data errors
    DATA_NOT_FOUND = 'E101'
    DATA_INVALID = 'E102'
    DATA_CORRUPTED = 'E103'
    DATA_INCOMPLETE = 'E104'
    
    # Processing errors
    PROCESSING_FAILED = 'E201'
    TIMEOUT_ERROR = 'E202'
    RESOURCE_EXHAUSTED = 'E203'
    DEPENDENCY_ERROR = 'E204'
    
    # Integration errors
    API_ERROR = 'E301'
    NETWORK_ERROR = 'E302'
    SERVICE_UNAVAILABLE = 'E303'
    RATE_LIMIT_EXCEEDED = 'E304'
    
    # Export errors
    EXPORT_FAILED = 'E401'
    FORMAT_ERROR = 'E402'
    FILE_ERROR = 'E403'
    SIZE_LIMIT_EXCEEDED = 'E404'


# Error messages
ERROR_MESSAGES = {
    ErrorCode.UNKNOWN_ERROR: 'An unknown error occurred',
    ErrorCode.VALIDATION_ERROR: 'Data validation failed',
    ErrorCode.PERMISSION_ERROR: 'Insufficient permissions',
    ErrorCode.AUTHENTICATION_ERROR: 'Authentication required',
    ErrorCode.DATA_NOT_FOUND: 'Requested data not found',
    ErrorCode.DATA_INVALID: 'Data format is invalid',
    ErrorCode.DATA_CORRUPTED: 'Data appears to be corrupted',
    ErrorCode.DATA_INCOMPLETE: 'Data is incomplete',
    ErrorCode.PROCESSING_FAILED: 'Data processing failed',
    ErrorCode.TIMEOUT_ERROR: 'Operation timed out',
    ErrorCode.RESOURCE_EXHAUSTED: 'System resources exhausted',
    ErrorCode.DEPENDENCY_ERROR: 'External dependency error',
    ErrorCode.API_ERROR: 'External API error',
    ErrorCode.NETWORK_ERROR: 'Network connectivity error',
    ErrorCode.SERVICE_UNAVAILABLE: 'Service temporarily unavailable',
    ErrorCode.RATE_LIMIT_EXCEEDED: 'Rate limit exceeded',
    ErrorCode.EXPORT_FAILED: 'Data export failed',
    ErrorCode.FORMAT_ERROR: 'Invalid export format',
    ErrorCode.FILE_ERROR: 'File operation error',
    ErrorCode.SIZE_LIMIT_EXCEEDED: 'File size limit exceeded',
}


# =============================================================================
# CACHE CONSTANTS
# =============================================================================

# Cache keys
CACHE_KEYS = {
    'ANALYTICS_DATA': 'analytics:data:{model}:{id}',
    'ANALYTICS_SUMMARY': 'analytics:summary:{type}:{period}',
    'REPORT_DATA': 'analytics:report:{id}',
    'DASHBOARD_DATA': 'analytics:dashboard:{user_id}:{widget}',
    'PERFORMANCE_METRICS': 'analytics:performance:{metric}:{period}',
    'USER_PERMISSIONS': 'analytics:permissions:{user_id}',
    'CAMPAIGN_ANALYTICS': 'analytics:campaign:{campaign_id}:{period}',
    'CHANNEL_ANALYTICS': 'analytics:channel:{channel_id}:{period}',
}

# Cache timeouts (in seconds)
CACHE_TIMEOUTS = {
    'REAL_TIME': 60,        # 1 minute
    'SHORT_TERM': 300,      # 5 minutes
    'MEDIUM_TERM': 1800,    # 30 minutes
    'LONG_TERM': 3600,      # 1 hour
    'DAILY': 86400,         # 24 hours
    'WEEKLY': 604800,       # 7 days
    'PERMANENT': 2592000,   # 30 days
}


# =============================================================================
# PROVIDER CONSTANTS
# =============================================================================

class AnalyticsProvider(Enum):
    """
    Analytics provider enumeration.
    
    Defines the different analytics data providers
    integrated with the system.
    """
    SFR = 'sfr'
    BOUYGUES = 'bouygues'
    INTERNAL = 'internal'
    GOOGLE_ANALYTICS = 'google_analytics'
    ADOBE_ANALYTICS = 'adobe_analytics'
    
    @classmethod
    def choices(cls):
        """Return choices for Django model fields."""
        return [(provider.value, provider.value.upper()) for provider in cls]


class DeviceType(Enum):
    """
    Device type enumeration.
    
    Defines the different device types for
    analytics tracking and reporting.
    """
    TV = 'tv'
    MOBILE = 'mobile'
    TABLET = 'tablet'
    DESKTOP = 'desktop'
    STREAMING_DEVICE = 'streaming_device'
    SMART_TV = 'smart_tv'
    GAME_CONSOLE = 'game_console'
    OTHER = 'other'
    
    @classmethod
    def choices(cls):
        """Return choices for Django model fields."""
        return [(device.value, device.value.replace('_', ' ').title()) for device in cls]


# =============================================================================
# REPORT CONSTANTS
# =============================================================================

class ReportType(Enum):
    """
    Report type enumeration.
    
    Defines the different types of analytics reports
    that can be generated.
    """
    CAMPAIGN_PERFORMANCE = 'campaign_performance'
    CHANNEL_ANALYTICS = 'channel_analytics'
    AUDIENCE_INSIGHTS = 'audience_insights'
    REVENUE_ANALYSIS = 'revenue_analysis'
    TECHNICAL_PERFORMANCE = 'technical_performance'
    CUSTOM = 'custom'
    EXECUTIVE_SUMMARY = 'executive_summary'
    DETAILED_ANALYSIS = 'detailed_analysis'
    
    @classmethod
    def choices(cls):
        """Return choices for Django model fields."""
        return [(report.value, report.value.replace('_', ' ').title()) for report in cls]


class ReportFrequency(Enum):
    """
    Report frequency enumeration.
    
    Defines how often automated reports
    should be generated.
    """
    REAL_TIME = 'real_time'
    HOURLY = 'hourly'
    DAILY = 'daily'
    WEEKLY = 'weekly'
    MONTHLY = 'monthly'
    QUARTERLY = 'quarterly'
    YEARLY = 'yearly'
    ON_DEMAND = 'on_demand'
    
    @classmethod
    def choices(cls):
        """Return choices for Django model fields."""
        return [(freq.value, freq.value.replace('_', ' ').title()) for freq in cls]


# =============================================================================
# DASHBOARD CONSTANTS
# =============================================================================

class WidgetType(Enum):
    """
    Dashboard widget type enumeration.
    
    Defines the different types of widgets
    available for analytics dashboards.
    """
    CHART = 'chart'
    TABLE = 'table'
    METRIC = 'metric'
    GAUGE = 'gauge'
    MAP = 'map'
    TIMELINE = 'timeline'
    HEATMAP = 'heatmap'
    FUNNEL = 'funnel'
    
    @classmethod
    def choices(cls):
        """Return choices for Django model fields."""
        return [(widget.value, widget.value.title()) for widget in cls]


class ChartType(Enum):
    """
    Chart type enumeration.
    
    Defines the different types of charts
    available for data visualization.
    """
    LINE = 'line'
    BAR = 'bar'
    PIE = 'pie'
    AREA = 'area'
    SCATTER = 'scatter'
    HISTOGRAM = 'histogram'
    BOX_PLOT = 'box_plot'
    CANDLESTICK = 'candlestick'
    
    @classmethod
    def choices(cls):
        """Return choices for Django model fields."""
        return [(chart.value, chart.value.replace('_', ' ').title()) for chart in cls]


# =============================================================================
# VALIDATION CONSTANTS
# =============================================================================

# Field validation constants
VALIDATION_CONSTANTS = {
    'MAX_STRING_LENGTH': 255,
    'MAX_TEXT_LENGTH': 5000,
    'MAX_URL_LENGTH': 2048,
    'MAX_EMAIL_LENGTH': 254,
    'MIN_PASSWORD_LENGTH': 8,
    'MAX_FILE_SIZE': 10 * 1024 * 1024,  # 10 MB
    'MAX_EXPORT_RECORDS': 100000,
    'MAX_BATCH_SIZE': 1000,
    'MIN_RATING': 0.0,
    'MAX_RATING': 10.0,
    'MIN_PERCENTAGE': 0.0,
    'MAX_PERCENTAGE': 100.0,
}

# Regular expressions for validation
VALIDATION_PATTERNS = {
    'EMAIL': r'^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$',
    'PHONE': r'^\+?1?\d{9,15}$',
    'URL': r'^https?:\/\/(www\.)?[-a-zA-Z0-9@:%._\+~#=]{1,256}\.[a-zA-Z0-9()]{1,6}\b([-a-zA-Z0-9()@:%_\+.~#?&//=]*)$',
    'IP_ADDRESS': r'^(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$',
    'UUID': r'^[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$',
    'SLUG': r'^[-a-zA-Z0-9_]+$',
}


# =============================================================================
# DEFAULT VALUES
# =============================================================================

# Default configuration values
DEFAULT_VALUES = {
    'PAGINATION_SIZE': 25,
    'MAX_PAGINATION_SIZE': 100,
    'CACHE_TIMEOUT': 300,
    'REQUEST_TIMEOUT': 30,
    'RETRY_ATTEMPTS': 3,
    'RETRY_DELAY': 1,
    'BATCH_SIZE': 100,
    'WORKER_CONCURRENCY': 4,
    'QUEUE_PRIORITY': 5,
    'LOG_LEVEL': 'INFO',
    'DEBUG_MODE': False,
    'MAINTENANCE_MODE': False,
}

# Default metric values
DEFAULT_METRICS = {
    'IMPRESSION_COUNT': 0,
    'CLICK_COUNT': 0,
    'CONVERSION_COUNT': 0,
    'CLICK_RATE': 0.0,
    'CONVERSION_RATE': 0.0,
    'COMPLETION_RATE': 0.0,
    'ENGAGEMENT_TIME': 0,
    'BOUNCE_RATE': 0.0,
    'REVENUE': 0.0,
    'COST': 0.0,
    'ROI': 0.0,
}


# =============================================================================
# API CONSTANTS
# =============================================================================

# HTTP status codes
HTTP_STATUS = {
    'OK': 200,
    'CREATED': 201,
    'ACCEPTED': 202,
    'NO_CONTENT': 204,
    'BAD_REQUEST': 400,
    'UNAUTHORIZED': 401,
    'FORBIDDEN': 403,
    'NOT_FOUND': 404,
    'METHOD_NOT_ALLOWED': 405,
    'CONFLICT': 409,
    'UNPROCESSABLE_ENTITY': 422,
    'TOO_MANY_REQUESTS': 429,
    'INTERNAL_SERVER_ERROR': 500,
    'BAD_GATEWAY': 502,
    'SERVICE_UNAVAILABLE': 503,
    'GATEWAY_TIMEOUT': 504,
}

# API rate limits
RATE_LIMITS = {
    'DEFAULT': '100/hour',
    'AUTHENTICATED': '1000/hour',
    'PREMIUM': '10000/hour',
    'EXPORT': '10/hour',
    'REPORT_GENERATION': '5/hour',
    'BULK_OPERATIONS': '50/hour',
}

# API versions
API_VERSIONS = {
    'CURRENT': 'v1',
    'SUPPORTED': ['v1'],
    'DEPRECATED': [],
}


# =============================================================================
# SECURITY CONSTANTS
# =============================================================================

# Security settings
SECURITY_SETTINGS = {
    'PASSWORD_MIN_LENGTH': 8,
    'PASSWORD_REQUIRE_UPPERCASE': True,
    'PASSWORD_REQUIRE_LOWERCASE': True,
    'PASSWORD_REQUIRE_NUMBERS': True,
    'PASSWORD_REQUIRE_SYMBOLS': True,
    'SESSION_TIMEOUT': 3600,  # 1 hour
    'MAX_LOGIN_ATTEMPTS': 5,
    'LOCKOUT_DURATION': 900,  # 15 minutes
    'TOKEN_EXPIRY': 86400,  # 24 hours
    'REFRESH_TOKEN_EXPIRY': 604800,  # 7 days
}

# Encryption settings
ENCRYPTION_SETTINGS = {
    'ALGORITHM': 'AES-256-GCM',
    'KEY_SIZE': 256,
    'IV_SIZE': 96,
    'TAG_SIZE': 128,
    'SALT_SIZE': 128,
    'ITERATIONS': 100000,
}


# =============================================================================
# UTILITY FUNCTIONS
# =============================================================================

def get_choices_dict(enum_class):
    """
    Get choices dictionary from enum class.
    
    Args:
        enum_class: Enum class
        
    Returns:
        Dictionary of choices
    """
    return {choice.value: choice.name for choice in enum_class}


def get_default_value(key: str, category: str = 'DEFAULT_VALUES'):
    """
    Get default value by key and category.
    
    Args:
        key: Configuration key
        category: Configuration category
        
    Returns:
        Default value or None
    """
    categories = {
        'DEFAULT_VALUES': DEFAULT_VALUES,
        'DEFAULT_METRICS': DEFAULT_METRICS,
        'TIME_CONSTANTS': TIME_CONSTANTS,
        'VALIDATION_CONSTANTS': VALIDATION_CONSTANTS,
        'SECURITY_SETTINGS': SECURITY_SETTINGS,
    }
    
    category_dict = categories.get(category, {})
    return category_dict.get(key)


def validate_enum_value(value: str, enum_class) -> bool:
    """
    Validate if value exists in enum class.
    
    Args:
        value: Value to validate
        enum_class: Enum class to check against
        
    Returns:
        True if valid, False otherwise
    """
    try:
        return value in [choice.value for choice in enum_class]
    except (AttributeError, TypeError):
        return False


def get_error_message(error_code: ErrorCode) -> str:
    """
    Get error message for error code.
    
    Args:
        error_code: Error code enum
        
    Returns:
        Error message string
    """
    return ERROR_MESSAGES.get(error_code, 'Unknown error')


def get_cache_key(template: str, **kwargs) -> str:
    """
    Generate cache key from template and parameters.
    
    Args:
        template: Cache key template
        **kwargs: Template parameters
        
    Returns:
        Formatted cache key
    """
    try:
        return template.format(**kwargs)
    except (KeyError, ValueError):
        return template


def get_mime_type(export_format: str) -> str:
    """
    Get MIME type for export format.
    
    Args:
        export_format: Export format string
        
    Returns:
        MIME type string
    """
    try:
        format_enum = ExportFormat(export_format)
        return ExportFormat.get_mime_type(format_enum)
    except ValueError:
        return 'application/octet-stream'


# =============================================================================
# EXPORTS
# =============================================================================

# Export all constants and enums
__all__ = [
    # Status enums
    'AnalyticsStatus',
    'ReportStatus',
    'DataQuality',
    
    # Metric enums
    'MetricType',
    'MetricCategory',
    'AggregationType',
    
    # Time enums
    'TimeGranularity',
    'TimeSlot',
    
    # Format enums
    'ExportFormat',
    'DataFormat',
    
    # Provider enums
    'AnalyticsProvider',
    'DeviceType',
    
    # Report enums
    'ReportType',
    'ReportFrequency',
    
    # Dashboard enums
    'WidgetType',
    'ChartType',
    
    # Error enums
    'ErrorCode',
    
    # Constants dictionaries
    'TIME_CONSTANTS',
    'PERFORMANCE_THRESHOLDS',
    'ANALYTICS_THRESHOLDS',
    'QUALITY_THRESHOLDS',
    'ERROR_MESSAGES',
    'CACHE_KEYS',
    'CACHE_TIMEOUTS',
    'VALIDATION_CONSTANTS',
    'VALIDATION_PATTERNS',
    'DEFAULT_VALUES',
    'DEFAULT_METRICS',
    'HTTP_STATUS',
    'RATE_LIMITS',
    'API_VERSIONS',
    'SECURITY_SETTINGS',
    'ENCRYPTION_SETTINGS',
    
    # Utility functions
    'get_choices_dict',
    'get_default_value',
    'validate_enum_value',
    'get_error_message',
    'get_cache_key',
    'get_mime_type',
]