"""
🎬 django-hlsfield - Django адаптивное видео с HLS/DASH стримингом

Автоматическое создание адаптивного видео для Django проектов.
Поддерживает HLS, DASH, превью, метаданные и Celery интеграцию.

Основные возможности:
- VideoField - базовое поле с метаданными
- HLSVideoField - HTTP Live Streaming
- DASHVideoField - MPEG-DASH адаптивный стрим
- AdaptiveVideoField - HLS + DASH одновременно
- Готовые HTML5 плееры
- Celery фоновая обработка
- Поддержка любых storage backends

Пример использования:
    from hlsfield import HLSVideoField

    class Movie(models.Model):
        title = models.CharField(max_length=200)
        video = HLSVideoField(
            upload_to="movies/",
            hls_playlist_field="hls_master"
        )
        hls_master = models.CharField(max_length=500, null=True, blank=True)

Автор: akula993
Лицензия: MIT
GitHub: https://github.com/akula993/django-hlsfield
"""

# Версия пакета (семантическое версионирование)
__version__ = "1.0.5"

# Метаданные пакета
__title__ = "django-hlsfield"
__description__ = "Django VideoField + HLS/DASH adaptive streaming with automatic transcoding"
__url__ = "https://github.com/akula993/django-hlsfield"
__author__ = "akula993"
__author_email__ = "akula993@gmail.com"
__license__ = "MIT"
__copyright__ = "Copyright 2025 akula993"

# Статус разработки
__status__ = "Production/Stable"

from django.core.exceptions import ImproperlyConfigured

# ==============================================================================
# ОСНОВНЫЕ ИМПОРТЫ
# ==============================================================================

# Основные поля (главный API)
from .fields import (
    VideoField,
    VideoFieldFile,
    HLSVideoField,
    HLSVideoFieldFile,
    DASHVideoField,
    DASHVideoFieldFile,
    AdaptiveVideoField,
    AdaptiveVideoFieldFile,
)

# Валидация и утилиты
from .fields import (
    validate_ladder,
    get_optimal_ladder_for_resolution,
)

# Исключения для обработки ошибок
from .exceptions import (
    HLSFieldError,
    FFmpegError,
    FFmpegNotFoundError,
    InvalidVideoError,
    TranscodingError,
    StorageError,
    ConfigurationError,
)

# Вспомогательные функции
from .helpers import (
    video_upload_to,
    get_video_upload_path,
    generate_video_id,
)

# ==============================================================================
# ЭКСПОРТЫ ПАКЕТА
# ==============================================================================

# Основной API - поля для использования в models.py
__all__ = [
    # === ОСНОВНЫЕ ПОЛЯ ===
    'VideoField',  # Базовое видео поле с метаданными
    'HLSVideoField',  # HTTP Live Streaming
    'DASHVideoField',  # MPEG-DASH адаптивный стрим
    'AdaptiveVideoField',  # HLS + DASH одновременно

    # === FILE OBJECTS ===
    'VideoFieldFile',  # Файловый объект для VideoField
    'HLSVideoFieldFile',  # Файловый объект для HLSVideoField
    'DASHVideoFieldFile',  # Файловый объект для DASHVideoField
    'AdaptiveVideoFieldFile',  # Файловый объект для AdaptiveVideoField

    # === УТИЛИТЫ ===
    'validate_ladder',  # Валидация лестницы качеств
    'get_optimal_ladder_for_resolution',  # Генерация оптимальной лестницы
    'video_upload_to',  # Функция upload_to
    'get_video_upload_path',  # Генерация путей для видео
    'generate_video_id',  # Генерация уникальных ID

    # === ИСКЛЮЧЕНИЯ ===
    'HLSFieldError',  # Базовое исключение пакета
    'FFmpegError',  # Ошибки FFmpeg
    'FFmpegNotFoundError',  # FFmpeg не найден
    'InvalidVideoError',  # Некорректный видеофайл
    'TranscodingError',  # Ошибки транскодинга
    'StorageError',  # Ошибки storage
    'ConfigurationError',  # Ошибки конфигурации

    # === МЕТАДАННЫЕ ===
    '__version__',  # Версия пакета
]


# ==============================================================================
# УСЛОВНЫЕ ИМПОРТЫ (для дополнительных функций)
# ==============================================================================

def _get_advanced_fields():
    """Ленивый импорт продвинутых полей"""
    try:
        from .smart_fields import SmartAdaptiveVideoField, ProgressiveVideoField
        return {
            'SmartAdaptiveVideoField': SmartAdaptiveVideoField,
            'ProgressiveVideoField': ProgressiveVideoField,
        }
    except ImportError:
        return {}


def _get_streaming_views():
    """Ленивый импорт streaming views"""
    try:
        from .streaming import SecureStreamingView, ProtectedHLSView
        return {
            'SecureStreamingView': SecureStreamingView,
            'ProtectedHLSView': ProtectedHLSView,
        }
    except ImportError:
        return {}


def _get_analytics():
    """Ленивый импорт аналитики"""
    try:
        from .views import VideoAnalyticsView, VideoStatsView
        return {
            'VideoAnalyticsView': VideoAnalyticsView,
            'VideoStatsView': VideoStatsView,
        }
    except ImportError:
        return {}


# ==============================================================================
# МАГИЧЕСКИЕ МЕТОДЫ ДЛЯ ДИНАМИЧЕСКИХ ИМПОРТОВ
# ==============================================================================

def __getattr__(name: str):
    """
    Динамический импорт модулей при первом обращении.

    Позволяет импортировать дополнительные компоненты только при необходимости:
    - from hlsfield import SmartAdaptiveVideoField
    - from hlsfield import SecureStreamingView
    - from hlsfield import VideoAnalyticsView
    """

    # Продвинутые поля
    advanced_fields = _get_advanced_fields()
    if name in advanced_fields:
        return advanced_fields[name]

    # Streaming views
    streaming_views = _get_streaming_views()
    if name in streaming_views:
        return streaming_views[name]

    # Аналитика
    analytics = _get_analytics()
    if name in analytics:
        return analytics[name]

    # Задачи Celery
    if name.endswith('_task') or name.startswith('build_'):
        try:
            from . import tasks
            if hasattr(tasks, name):
                return getattr(tasks, name)
        except ImportError:
            pass

    # Настройки по умолчанию
    if name.startswith('DEFAULT_') or name in ['SEGMENT_DURATION', 'FFMPEG', 'FFPROBE']:
        try:
            from . import defaults
            if hasattr(defaults, name):
                return getattr(defaults, name)
        except ImportError:
            pass

    raise AttributeError(f"module '{__name__}' has no attribute '{name}'")


def __dir__():
    """Возвращает список доступных атрибутов для автокомплита"""

    base_attrs = __all__.copy()

    # Добавляем продвинутые поля если доступны
    base_attrs.extend(_get_advanced_fields().keys())

    # Добавляем streaming views если доступны
    base_attrs.extend(_get_streaming_views().keys())

    # Добавляем аналитику если доступна
    base_attrs.extend(_get_analytics().keys())

    # Добавляем основные настройки
    base_attrs.extend([
        'DEFAULT_LADDER', 'SEGMENT_DURATION', 'FFMPEG', 'FFPROBE',
        'MOBILE_LADDER', 'PREMIUM_LADDER'
    ])

    return sorted(base_attrs)


# ==============================================================================
# ПРОВЕРКИ СОВМЕСТИМОСТИ
# ==============================================================================

def check_django_version():
    """Проверяет совместимость с версией Django"""
    try:
        import django
        from packaging import version

        django_version_str = "{}.{}".format(*django.VERSION[:2])
        django_version = version.parse(django_version_str)
        min_version = version.parse("4.2")

        if django_version < min_version:
            import warnings
            warnings.warn(
                f"django-hlsfield requires Django 4.2+, you have {django.get_version()}",
                UserWarning,
                stacklevel=2
            )
    except ImportError:
        pass


def check_python_version():
    """Проверяет совместимость с версией Python"""
    import sys

    if sys.version_info < (3, 10):
        import warnings
        warnings.warn(
            f"django-hlsfield requires Python 3.10+, you have {sys.version}",
            UserWarning,
            stacklevel=2
        )


# Выполняем проверки при импорте (только в development)
try:
    from django.conf import settings

    if getattr(settings, 'DEBUG', False):
        check_django_version()
        check_python_version()
except (ImportError, ImproperlyConfigured):
    # Django еще не настроен
    pass

# ==============================================================================
# ИНФОРМАЦИЯ О ПАКЕТЕ ДЛЯ ИНСТРУМЕНТОВ
# ==============================================================================

# Информация для setuptools/pip
package_info = {
    'name': __title__,
    'version': __version__,
    'description': __description__,
    'url': __url__,
    'author': __author__,
    'author_email': __author_email__,
    'license': __license__,
    'status': __status__,
}

# Классификаторы для PyPI
classifiers = [
    'Development Status :: 5 - Production/Stable',
    'Framework :: Django',
    'Framework :: Django :: 4.2',
    'Framework :: Django :: 5.0',
    'Framework :: Django :: 5.1',
    'Intended Audience :: Developers',
    'License :: OSI Approved :: MIT License',
    'Operating System :: OS Independent',
    'Programming Language :: Python',
    'Programming Language :: Python :: 3',
    'Programming Language :: Python :: 3.10',
    'Programming Language :: Python :: 3.11',
    'Programming Language :: Python :: 3.12',
    'Programming Language :: Python :: 3.13',
    'Topic :: Internet :: WWW/HTTP',
    'Topic :: Internet :: WWW/HTTP :: Dynamic Content',
    'Topic :: Multimedia :: Video',
    'Topic :: Multimedia :: Video :: Conversion',
    'Topic :: Software Development :: Libraries :: Python Modules',
    "Environment :: Web Environment",
    "Natural Language :: English",
    "Natural Language :: Russian",
]

# Ключевые слова для поиска
keywords = [
    'django', 'video', 'hls', 'dash', 'streaming', 'adaptive', 'ffmpeg',
    'transcoding', 'celery', 'html5', 'player', 'multimedia', 'webdev'
]

# ==============================================================================
# DJANGO APPS REGISTRY
# ==============================================================================

# Автоматическая конфигурация Django app
default_app_config = 'hlsfield.apps.HLSFieldConfig'

# ==============================================================================
# ЗАВЕРШАЮЩЕЕ СООБЩЕНИЕ
# ==============================================================================

# При первом импорте показываем краткую информацию (только в DEBUG)
try:
    from django.conf import settings
    from django.core.exceptions import ImproperlyConfigured

    if getattr(settings, 'DEBUG', False):
        import sys

        if 'runserver' in sys.argv or 'shell' in sys.argv:
            print(f"🎬 {__title__} v{__version__} loaded")
except (ImportError, ImproperlyConfigured, AttributeError):
    pass
