"""Core Constants

This module contains application-wide constants, choices, and configuration values
for the Adtlas project.
"""

from django.utils.translation import gettext_lazy as _


# ============================================================================
# General Constants
# ============================================================================

# Application Information
APP_NAME = 'Adtlas'
APP_VERSION = '1.0.0'
APP_DESCRIPTION = 'Advanced Data Management and Analytics Platform'

# Default Values
DEFAULT_PAGE_SIZE = 20
MAX_PAGE_SIZE = 100
DEFAULT_CACHE_TIMEOUT = 300  # 5 minutes
DEFAULT_SESSION_TIMEOUT = 1800  # 30 minutes

# Limits
MAX_UPLOAD_SIZE = 10 * 1024 * 1024  # 10MB
MAX_BULK_OPERATIONS = 1000
MAX_SEARCH_RESULTS = 500
MAX_EXPORT_RECORDS = 10000

# Timeouts
API_TIMEOUT = 30  # seconds
DATABASE_TIMEOUT = 60  # seconds
CACHE_TIMEOUT = 300  # seconds
EMAIL_TIMEOUT = 30  # seconds


# ============================================================================
# Status Choices
# ============================================================================

STATUS_ACTIVE = 'active'
STATUS_INACTIVE = 'inactive'
STATUS_PENDING = 'pending'
STATUS_SUSPENDED = 'suspended'
STATUS_DELETED = 'deleted'
STATUS_DRAFT = 'draft'
STATUS_PUBLISHED = 'published'
STATUS_ARCHIVED = 'archived'

STATUS_CHOICES = [
    (STATUS_ACTIVE, _('Active')),
    (STATUS_INACTIVE, _('Inactive')),
    (STATUS_PENDING, _('Pending')),
    (STATUS_SUSPENDED, _('Suspended')),
    (STATUS_DELETED, _('Deleted')),
    (STATUS_DRAFT, _('Draft')),
    (STATUS_PUBLISHED, _('Published')),
    (STATUS_ARCHIVED, _('Archived')),
]

# Simple Status Choices
SIMPLE_STATUS_CHOICES = [
    (STATUS_ACTIVE, _('Active')),
    (STATUS_INACTIVE, _('Inactive')),
]

# Content Status Choices
CONTENT_STATUS_CHOICES = [
    (STATUS_DRAFT, _('Draft')),
    (STATUS_PUBLISHED, _('Published')),
    (STATUS_ARCHIVED, _('Archived')),
]


# ============================================================================
# Priority Choices
# ============================================================================

PRIORITY_LOW = 'low'
PRIORITY_MEDIUM = 'medium'
PRIORITY_HIGH = 'high'
PRIORITY_URGENT = 'urgent'
PRIORITY_CRITICAL = 'critical'

PRIORITY_CHOICES = [
    (PRIORITY_LOW, _('Low')),
    (PRIORITY_MEDIUM, _('Medium')),
    (PRIORITY_HIGH, _('High')),
    (PRIORITY_URGENT, _('Urgent')),
    (PRIORITY_CRITICAL, _('Critical')),
]

# Priority Values (for sorting)
PRIORITY_VALUES = {
    PRIORITY_LOW: 1,
    PRIORITY_MEDIUM: 2,
    PRIORITY_HIGH: 3,
    PRIORITY_URGENT: 4,
    PRIORITY_CRITICAL: 5,
}


# ============================================================================
# Activity Types
# ============================================================================

ACTIVITY_LOGIN = 'login'
ACTIVITY_LOGOUT = 'logout'
ACTIVITY_CREATE = 'create'
ACTIVITY_UPDATE = 'update'
ACTIVITY_DELETE = 'delete'
ACTIVITY_VIEW = 'view'
ACTIVITY_DOWNLOAD = 'download'
ACTIVITY_UPLOAD = 'upload'
ACTIVITY_EXPORT = 'export'
ACTIVITY_IMPORT = 'import'
ACTIVITY_SEARCH = 'search'
ACTIVITY_FILTER = 'filter'
ACTIVITY_SORT = 'sort'
ACTIVITY_BULK_ACTION = 'bulk_action'
ACTIVITY_PASSWORD_CHANGE = 'password_change'
ACTIVITY_PASSWORD_RESET = 'password_reset'
ACTIVITY_PROFILE_UPDATE = 'profile_update'
ACTIVITY_SETTINGS_CHANGE = 'settings_change'
ACTIVITY_PERMISSION_CHANGE = 'permission_change'
ACTIVITY_ROLE_ASSIGNMENT = 'role_assignment'
ACTIVITY_ACCOUNT_LOCK = 'account_lock'
ACTIVITY_ACCOUNT_UNLOCK = 'account_unlock'
ACTIVITY_FAILED_LOGIN = 'failed_login'
ACTIVITY_SUSPICIOUS = 'suspicious'
ACTIVITY_ERROR = 'error'
ACTIVITY_WARNING = 'warning'
ACTIVITY_INFO = 'info'

ACTIVITY_TYPE_CHOICES = [
    # Authentication Activities
    (ACTIVITY_LOGIN, _('Login')),
    (ACTIVITY_LOGOUT, _('Logout')),
    (ACTIVITY_FAILED_LOGIN, _('Failed Login')),
    (ACTIVITY_PASSWORD_CHANGE, _('Password Change')),
    (ACTIVITY_PASSWORD_RESET, _('Password Reset')),
    
    # CRUD Activities
    (ACTIVITY_CREATE, _('Create')),
    (ACTIVITY_UPDATE, _('Update')),
    (ACTIVITY_DELETE, _('Delete')),
    (ACTIVITY_VIEW, _('View')),
    
    # File Activities
    (ACTIVITY_DOWNLOAD, _('Download')),
    (ACTIVITY_UPLOAD, _('Upload')),
    (ACTIVITY_EXPORT, _('Export')),
    (ACTIVITY_IMPORT, _('Import')),
    
    # User Interface Activities
    (ACTIVITY_SEARCH, _('Search')),
    (ACTIVITY_FILTER, _('Filter')),
    (ACTIVITY_SORT, _('Sort')),
    (ACTIVITY_BULK_ACTION, _('Bulk Action')),
    
    # Profile & Settings
    (ACTIVITY_PROFILE_UPDATE, _('Profile Update')),
    (ACTIVITY_SETTINGS_CHANGE, _('Settings Change')),
    
    # Security Activities
    (ACTIVITY_PERMISSION_CHANGE, _('Permission Change')),
    (ACTIVITY_ROLE_ASSIGNMENT, _('Role Assignment')),
    (ACTIVITY_ACCOUNT_LOCK, _('Account Lock')),
    (ACTIVITY_ACCOUNT_UNLOCK, _('Account Unlock')),
    (ACTIVITY_SUSPICIOUS, _('Suspicious Activity')),
    
    # System Activities
    (ACTIVITY_ERROR, _('Error')),
    (ACTIVITY_WARNING, _('Warning')),
    (ACTIVITY_INFO, _('Information')),
]


# ============================================================================
# File & Media Constants
# ============================================================================

# File Types
FILE_TYPE_IMAGE = 'image'
FILE_TYPE_DOCUMENT = 'document'
FILE_TYPE_SPREADSHEET = 'spreadsheet'
FILE_TYPE_PRESENTATION = 'presentation'
FILE_TYPE_ARCHIVE = 'archive'
FILE_TYPE_VIDEO = 'video'
FILE_TYPE_AUDIO = 'audio'
FILE_TYPE_OTHER = 'other'

FILE_TYPE_CHOICES = [
    (FILE_TYPE_IMAGE, _('Image')),
    (FILE_TYPE_DOCUMENT, _('Document')),
    (FILE_TYPE_SPREADSHEET, _('Spreadsheet')),
    (FILE_TYPE_PRESENTATION, _('Presentation')),
    (FILE_TYPE_ARCHIVE, _('Archive')),
    (FILE_TYPE_VIDEO, _('Video')),
    (FILE_TYPE_AUDIO, _('Audio')),
    (FILE_TYPE_OTHER, _('Other')),
]

# Allowed File Extensions
ALLOWED_IMAGE_EXTENSIONS = ['.jpg', '.jpeg', '.png', '.gif', '.webp', '.svg']
ALLOWED_DOCUMENT_EXTENSIONS = ['.pdf', '.doc', '.docx', '.txt', '.rtf', '.odt']
ALLOWED_SPREADSHEET_EXTENSIONS = ['.xls', '.xlsx', '.csv', '.ods']
ALLOWED_PRESENTATION_EXTENSIONS = ['.ppt', '.pptx', '.odp']
ALLOWED_ARCHIVE_EXTENSIONS = ['.zip', '.rar', '.7z', '.tar', '.gz']
ALLOWED_VIDEO_EXTENSIONS = ['.mp4', '.avi', '.mov', '.wmv', '.flv', '.webm']
ALLOWED_AUDIO_EXTENSIONS = ['.mp3', '.wav', '.ogg', '.m4a', '.flac']

# MIME Types
ALLOWED_IMAGE_MIMES = [
    'image/jpeg', 'image/png', 'image/gif', 'image/webp', 'image/svg+xml'
]
ALLOWED_DOCUMENT_MIMES = [
    'application/pdf', 'application/msword', 
    'application/vnd.openxmlformats-officedocument.wordprocessingml.document',
    'text/plain', 'application/rtf'
]
ALLOWED_SPREADSHEET_MIMES = [
    'application/vnd.ms-excel',
    'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',
    'text/csv'
]


# ============================================================================
# Date & Time Constants
# ============================================================================

# Date Formats
DATE_FORMAT = '%Y-%m-%d'
DATETIME_FORMAT = '%Y-%m-%d %H:%M:%S'
TIME_FORMAT = '%H:%M:%S'
DISPLAY_DATE_FORMAT = '%B %d, %Y'
DISPLAY_DATETIME_FORMAT = '%B %d, %Y at %I:%M %p'

# Time Periods
TIME_PERIOD_HOUR = 'hour'
TIME_PERIOD_DAY = 'day'
TIME_PERIOD_WEEK = 'week'
TIME_PERIOD_MONTH = 'month'
TIME_PERIOD_QUARTER = 'quarter'
TIME_PERIOD_YEAR = 'year'

TIME_PERIOD_CHOICES = [
    (TIME_PERIOD_HOUR, _('Hour')),
    (TIME_PERIOD_DAY, _('Day')),
    (TIME_PERIOD_WEEK, _('Week')),
    (TIME_PERIOD_MONTH, _('Month')),
    (TIME_PERIOD_QUARTER, _('Quarter')),
    (TIME_PERIOD_YEAR, _('Year')),
]

# Weekdays
WEEKDAYS = [
    (0, _('Monday')),
    (1, _('Tuesday')),
    (2, _('Wednesday')),
    (3, _('Thursday')),
    (4, _('Friday')),
    (5, _('Saturday')),
    (6, _('Sunday')),
]


# ============================================================================
# Notification Constants
# ============================================================================

NOTIFICATION_TYPE_INFO = 'info'
NOTIFICATION_TYPE_SUCCESS = 'success'
NOTIFICATION_TYPE_WARNING = 'warning'
NOTIFICATION_TYPE_ERROR = 'error'

NOTIFICATION_TYPE_CHOICES = [
    (NOTIFICATION_TYPE_INFO, _('Information')),
    (NOTIFICATION_TYPE_SUCCESS, _('Success')),
    (NOTIFICATION_TYPE_WARNING, _('Warning')),
    (NOTIFICATION_TYPE_ERROR, _('Error')),
]

# Notification Channels
NOTIFICATION_CHANNEL_EMAIL = 'email'
NOTIFICATION_CHANNEL_SMS = 'sms'
NOTIFICATION_CHANNEL_PUSH = 'push'
NOTIFICATION_CHANNEL_IN_APP = 'in_app'

NOTIFICATION_CHANNEL_CHOICES = [
    (NOTIFICATION_CHANNEL_EMAIL, _('Email')),
    (NOTIFICATION_CHANNEL_SMS, _('SMS')),
    (NOTIFICATION_CHANNEL_PUSH, _('Push Notification')),
    (NOTIFICATION_CHANNEL_IN_APP, _('In-App Notification')),
]


# ============================================================================
# Export/Import Constants
# ============================================================================

EXPORT_FORMAT_CSV = 'csv'
EXPORT_FORMAT_XLSX = 'xlsx'
EXPORT_FORMAT_JSON = 'json'
EXPORT_FORMAT_XML = 'xml'
EXPORT_FORMAT_PDF = 'pdf'

EXPORT_FORMAT_CHOICES = [
    (EXPORT_FORMAT_CSV, _('CSV')),
    (EXPORT_FORMAT_XLSX, _('Excel')),
    (EXPORT_FORMAT_JSON, _('JSON')),
    (EXPORT_FORMAT_XML, _('XML')),
    (EXPORT_FORMAT_PDF, _('PDF')),
]

# Import Status
IMPORT_STATUS_PENDING = 'pending'
IMPORT_STATUS_PROCESSING = 'processing'
IMPORT_STATUS_COMPLETED = 'completed'
IMPORT_STATUS_FAILED = 'failed'
IMPORT_STATUS_CANCELLED = 'cancelled'

IMPORT_STATUS_CHOICES = [
    (IMPORT_STATUS_PENDING, _('Pending')),
    (IMPORT_STATUS_PROCESSING, _('Processing')),
    (IMPORT_STATUS_COMPLETED, _('Completed')),
    (IMPORT_STATUS_FAILED, _('Failed')),
    (IMPORT_STATUS_CANCELLED, _('Cancelled')),
]


# ============================================================================
# Security Constants
# ============================================================================

# Password Strength Levels
PASSWORD_STRENGTH_VERY_WEAK = 0
PASSWORD_STRENGTH_WEAK = 1
PASSWORD_STRENGTH_FAIR = 2
PASSWORD_STRENGTH_GOOD = 3
PASSWORD_STRENGTH_STRONG = 4

PASSWORD_STRENGTH_CHOICES = [
    (PASSWORD_STRENGTH_VERY_WEAK, _('Very Weak')),
    (PASSWORD_STRENGTH_WEAK, _('Weak')),
    (PASSWORD_STRENGTH_FAIR, _('Fair')),
    (PASSWORD_STRENGTH_GOOD, _('Good')),
    (PASSWORD_STRENGTH_STRONG, _('Strong')),
]

# Security Settings
MAX_LOGIN_ATTEMPTS = 5
ACCOUNT_LOCKOUT_DURATION = 30  # minutes
PASSWORD_MIN_LENGTH = 8
PASSWORD_MAX_LENGTH = 128
SESSION_COOKIE_AGE = 1800  # 30 minutes
CSRF_COOKIE_AGE = 3600  # 1 hour

# Two-Factor Authentication
TWO_FA_METHOD_SMS = 'sms'
TWO_FA_METHOD_EMAIL = 'email'
TWO_FA_METHOD_APP = 'app'

TWO_FA_METHOD_CHOICES = [
    (TWO_FA_METHOD_SMS, _('SMS')),
    (TWO_FA_METHOD_EMAIL, _('Email')),
    (TWO_FA_METHOD_APP, _('Authenticator App')),
]


# ============================================================================
# API Constants
# ============================================================================

# HTTP Methods
HTTP_METHOD_GET = 'GET'
HTTP_METHOD_POST = 'POST'
HTTP_METHOD_PUT = 'PUT'
HTTP_METHOD_PATCH = 'PATCH'
HTTP_METHOD_DELETE = 'DELETE'
HTTP_METHOD_HEAD = 'HEAD'
HTTP_METHOD_OPTIONS = 'OPTIONS'

# API Versions
API_VERSION_V1 = 'v1'
API_VERSION_V2 = 'v2'

API_VERSION_CHOICES = [
    (API_VERSION_V1, _('Version 1')),
    (API_VERSION_V2, _('Version 2')),
]

# Rate Limiting
RATE_LIMIT_ANONYMOUS = '100/hour'
RATE_LIMIT_AUTHENTICATED = '1000/hour'
RATE_LIMIT_ADMIN = '10000/hour'

# Response Codes
RESPONSE_CODE_SUCCESS = 'success'
RESPONSE_CODE_ERROR = 'error'
RESPONSE_CODE_WARNING = 'warning'
RESPONSE_CODE_INFO = 'info'


# ============================================================================
# Cache Keys
# ============================================================================

CACHE_KEY_USER_PERMISSIONS = 'user_permissions_{user_id}'
CACHE_KEY_USER_ROLES = 'user_roles_{user_id}'
CACHE_KEY_SETTINGS = 'app_settings'
CACHE_KEY_MENU = 'user_menu_{user_id}'
CACHE_KEY_STATS = 'dashboard_stats_{user_id}'
CACHE_KEY_SEARCH_RESULTS = 'search_results_{query_hash}'
CACHE_KEY_EXPORT_TASK = 'export_task_{task_id}'
CACHE_KEY_IMPORT_TASK = 'import_task_{task_id}'


# ============================================================================
# Error Codes
# ============================================================================

ERROR_CODE_VALIDATION = 'validation_error'
ERROR_CODE_AUTHENTICATION = 'authentication_error'
ERROR_CODE_AUTHORIZATION = 'authorization_error'
ERROR_CODE_NOT_FOUND = 'not_found'
ERROR_CODE_CONFLICT = 'conflict'
ERROR_CODE_RATE_LIMIT = 'rate_limit_exceeded'
ERROR_CODE_SERVER_ERROR = 'server_error'
ERROR_CODE_SERVICE_UNAVAILABLE = 'service_unavailable'
ERROR_CODE_TIMEOUT = 'timeout'
ERROR_CODE_FILE_TOO_LARGE = 'file_too_large'
ERROR_CODE_INVALID_FILE_TYPE = 'invalid_file_type'
ERROR_CODE_DUPLICATE_ENTRY = 'duplicate_entry'
ERROR_CODE_BUSINESS_LOGIC = 'business_logic_error'
ERROR_CODE_EXTERNAL_SERVICE = 'external_service_error'


# ============================================================================
# Regular Expressions
# ============================================================================

# Common Patterns
REGEX_USERNAME = r'^[a-zA-Z0-9_.-]+$'
REGEX_SLUG = r'^[-a-zA-Z0-9_]+$'
REGEX_PHONE = r'^\+?1?\d{9,15}$'
REGEX_ALPHANUMERIC = r'^[a-zA-Z0-9]+$'
REGEX_HEX_COLOR = r'^#([A-Fa-f0-9]{6}|[A-Fa-f0-9]{3})$'
REGEX_IPV4 = 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]?)$'
REGEX_IPV6 = r'^(?:[0-9a-fA-F]{1,4}:){7}[0-9a-fA-F]{1,4}$'
REGEX_URL = r'^https?:\/\/(?:[-\w.])+(?:\:[0-9]+)?(?:\/(?:[\w\/_.])*(?:\?(?:[\w&=%.])*)?(?:\#(?:[\w.])*)?)?$'
REGEX_CREDIT_CARD = r'^(?:4[0-9]{12}(?:[0-9]{3})?|5[1-5][0-9]{14}|3[47][0-9]{13}|3[0-9]{13}|6(?:011|5[0-9]{2})[0-9]{12})$'


# ============================================================================
# Default Settings
# ============================================================================

DEFAULT_SETTINGS = {
    'site_name': APP_NAME,
    'site_description': APP_DESCRIPTION,
    'site_version': APP_VERSION,
    'default_page_size': DEFAULT_PAGE_SIZE,
    'max_page_size': MAX_PAGE_SIZE,
    'session_timeout': DEFAULT_SESSION_TIMEOUT,
    'cache_timeout': DEFAULT_CACHE_TIMEOUT,
    'max_upload_size': MAX_UPLOAD_SIZE,
    'max_login_attempts': MAX_LOGIN_ATTEMPTS,
    'account_lockout_duration': ACCOUNT_LOCKOUT_DURATION,
    'password_min_length': PASSWORD_MIN_LENGTH,
    'enable_two_factor_auth': False,
    'enable_email_notifications': True,
    'enable_sms_notifications': False,
    'enable_push_notifications': True,
    'enable_audit_logging': True,
    'enable_rate_limiting': True,
    'maintenance_mode': False,
    'debug_mode': False,
}


# ============================================================================
# Environment Constants
# ============================================================================

ENVIRONMENT_DEVELOPMENT = 'development'
ENVIRONMENT_TESTING = 'testing'
ENVIRONMENT_STAGING = 'staging'
ENVIRONMENT_PRODUCTION = 'production'

ENVIRONMENT_CHOICES = [
    (ENVIRONMENT_DEVELOPMENT, _('Development')),
    (ENVIRONMENT_TESTING, _('Testing')),
    (ENVIRONMENT_STAGING, _('Staging')),
    (ENVIRONMENT_PRODUCTION, _('Production')),
]


# ============================================================================
# Utility Functions
# ============================================================================

def get_choice_display(choices, value):
    """Get display value for a choice.
    
    Args:
        choices: List of choice tuples
        value: Choice value
        
    Returns:
        Display value or the original value if not found
    """
    choice_dict = dict(choices)
    return choice_dict.get(value, value)


def get_choice_values(choices):
    """Get list of choice values.
    
    Args:
        choices: List of choice tuples
        
    Returns:
        List of choice values
    """
    return [choice[0] for choice in choices]


def get_choice_displays(choices):
    """Get list of choice display values.
    
    Args:
        choices: List of choice tuples
        
    Returns:
        List of choice display values
    """
    return [choice[1] for choice in choices]


def is_valid_choice(choices, value):
    """Check if value is a valid choice.
    
    Args:
        choices: List of choice tuples
        value: Value to check
        
    Returns:
        Boolean indicating if value is valid
    """
    return value in get_choice_values(choices)