# config/urls.py
import logging
from django.contrib import admin
from django.urls import path, include
from django.conf import settings
from django.conf.urls.static import static
from typing import List, Union, Tuple, TypeAlias
from django.urls.resolvers import URLPattern, URLResolver
from rest_framework import permissions
from drf_spectacular.views import (
    SpectacularAPIView,
    SpectacularRedocView,
    SpectacularSwaggerView,
)

# Configure logging with proper formatting
logger = logging.getLogger(__name__)


# Type aliases for better code readability and maintainability
URLPatternsList: TypeAlias = List[Union[URLPattern, URLResolver]]
URLPatternsNamespace: TypeAlias = Tuple[List[Union[URLPattern, URLResolver]], str]

# API v1 URL patterns - Core API endpoints
api_v1_patterns: URLPatternsList = [
    # Django Spectacular API documentation
    path("schema/", SpectacularAPIView.as_view(), name="api-schema"),
    path(
        "docs/",
        SpectacularSwaggerView.as_view(url_name="api_v1:api-schema"),
        name="swagger-ui",
    ),
    path(
        "redoc/",
        SpectacularRedocView.as_view(url_name="api_v1:api-schema"),
        name="redoc",
    ),
    # # Accounts/Authentication endpoints
    # path("accounts/", include(("accounts.api.urls", "accounts"), namespace="accounts")),
    # path("chatbot/", include(("chatbot.api.urls", "chatbot"), namespace="chatbot")),
]

# Main URL patterns with versioning support
urlpatterns: URLPatternsList = [
    # Admin interface
    path(f"{settings.ADMIN_URL}", admin.site.urls),
    # API v1 endpoints
    path("api/v1/", include((api_v1_patterns, "v1"), namespace="api_v1")),
    # Future API versions can be added here
    # path('api/v2/',
    #      include((api_v2_patterns, 'v2'),
    #             namespace='api_v2')
    # ),
    # Authentication URLs (allauth)
    # path('accounts/',
    #      include('allauth.urls')
    #      ),
]

# Serve static and media files in development
if settings.DEBUG:
    urlpatterns += static(settings.STATIC_URL, document_root=settings.STATIC_ROOT)
    urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)

# Type checking and validation
assert all(
    isinstance(pattern, (URLPattern, URLResolver)) for pattern in urlpatterns
), "All URL patterns must be either URLPattern or URLResolver instances"
