# -*- coding: utf-8 -*-
"""
Analytics URL Configuration
==========================

URL patterns for the Adtlas Analytics module.
Defines API endpoints for analytics data access, reporting,
and dashboard functionality.

URL Patterns:
- /api/analytics/sfr/ - SFR analytics data endpoints
- /api/analytics/bouygues/ - Bouygues analytics data endpoints
- /api/analytics/impressions/ - Impression tracking endpoints
- /api/analytics/vast-responses/ - VAST response endpoints
- /api/analytics/performance/ - Performance metrics endpoints
- /api/analytics/reports/ - Analytics reports endpoints
- /api/analytics/dashboard/ - Dashboard data endpoints
- /api/analytics/export/ - Data export endpoints

API Features:
- RESTful API design
- Filtering and pagination
- Data aggregation
- Export capabilities
- Real-time data access
- Authentication required
- Permission-based access
- Rate limiting

Endpoint Categories:
1. Data Collection APIs
   - Raw analytics data
   - Impression tracking
   - VAST responses
   - Performance metrics

2. Reporting APIs
   - Report generation
   - Report management
   - Custom reports
   - Scheduled reports

3. Dashboard APIs
   - Real-time metrics
   - Aggregated data
   - Trend analysis
   - Performance indicators

4. Export APIs
   - CSV export
   - JSON export
   - PDF reports
   - Excel export

Authentication:
- Token-based authentication
- Permission-based access control
- Rate limiting per user
- API key support

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

from django.urls import path, include
from rest_framework.routers import DefaultRouter
from rest_framework.urlpatterns import format_suffix_patterns
from django.views.decorators.cache import cache_page
from django.views.decorators.vary import vary_on_headers

from .views import (
    # ViewSets
    SfrAnalyticsViewSet,
    BouyguesAnalyticsViewSet,
    ImpressionViewSet,
    VastResponseViewSet,
    PerformanceMetricViewSet,
    AnalyticsReportViewSet,
    
    # API Views
    AnalyticsDashboardView,
    AnalyticsExportView,
    AnalyticsSummaryView,
    AnalyticsTrendsView,
    AnalyticsComparisonView,
    AnalyticsAggregationView,
    
    # Utility Views
    AnalyticsHealthCheckView,
    AnalyticsMetricsView,
    AnalyticsConfigView
)

# App namespace
app_name = 'analytics'

# Create router for ViewSets
router = DefaultRouter()

# Register ViewSets with the router
router.register(
    r'sfr',
    SfrAnalyticsViewSet,
    basename='sfr-analytics'
)

router.register(
    r'bouygues',
    BouyguesAnalyticsViewSet,
    basename='bouygues-analytics'
)

router.register(
    r'impressions',
    ImpressionViewSet,
    basename='impressions'
)

router.register(
    r'vast-responses',
    VastResponseViewSet,
    basename='vast-responses'
)

router.register(
    r'performance',
    PerformanceMetricViewSet,
    basename='performance-metrics'
)

router.register(
    r'reports',
    AnalyticsReportViewSet,
    basename='analytics-reports'
)

# Define URL patterns
urlpatterns = [
    # Include router URLs
    path('api/', include(router.urls)),
    
    # Dashboard endpoints
    path(
        'api/dashboard/',
        cache_page(60 * 5)(  # Cache for 5 minutes
            vary_on_headers('Authorization')(
                AnalyticsDashboardView.as_view()
            )
        ),
        name='dashboard'
    ),
    
    path(
        'api/dashboard/summary/',
        cache_page(60 * 10)(  # Cache for 10 minutes
            AnalyticsSummaryView.as_view()
        ),
        name='dashboard-summary'
    ),
    
    path(
        'api/dashboard/trends/',
        cache_page(60 * 15)(  # Cache for 15 minutes
            AnalyticsTrendsView.as_view()
        ),
        name='dashboard-trends'
    ),
    
    path(
        'api/dashboard/comparison/',
        AnalyticsComparisonView.as_view(),
        name='dashboard-comparison'
    ),
    
    # Data aggregation endpoints
    path(
        'api/aggregation/',
        AnalyticsAggregationView.as_view(),
        name='data-aggregation'
    ),
    
    path(
        'api/aggregation/<str:metric_type>/',
        AnalyticsAggregationView.as_view(),
        name='metric-aggregation'
    ),
    
    # Export endpoints
    path(
        'api/export/',
        AnalyticsExportView.as_view(),
        name='data-export'
    ),
    
    path(
        'api/export/<str:format>/',
        AnalyticsExportView.as_view(),
        name='data-export-format'
    ),
    
    # Utility endpoints
    path(
        'api/health/',
        AnalyticsHealthCheckView.as_view(),
        name='health-check'
    ),
    
    path(
        'api/metrics/',
        AnalyticsMetricsView.as_view(),
        name='system-metrics'
    ),
    
    path(
        'api/config/',
        AnalyticsConfigView.as_view(),
        name='configuration'
    ),
    
    # Specific data endpoints
    path(
        'api/sfr/summary/',
        cache_page(60 * 10)(
            SfrAnalyticsViewSet.as_view({'get': 'summary'})
        ),
        name='sfr-summary'
    ),
    
    path(
        'api/bouygues/summary/',
        cache_page(60 * 10)(
            BouyguesAnalyticsViewSet.as_view({'get': 'summary'})
        ),
        name='bouygues-summary'
    ),
    
    path(
        'api/impressions/summary/',
        cache_page(60 * 5)(
            ImpressionViewSet.as_view({'get': 'summary'})
        ),
        name='impressions-summary'
    ),
    
    path(
        'api/vast-responses/summary/',
        cache_page(60 * 10)(
            VastResponseViewSet.as_view({'get': 'summary'})
        ),
        name='vast-responses-summary'
    ),
    
    path(
        'api/performance/summary/',
        cache_page(60 * 10)(
            PerformanceMetricViewSet.as_view({'get': 'summary'})
        ),
        name='performance-summary'
    ),
    
    # Report-specific endpoints
    path(
        'api/reports/generate/',
        AnalyticsReportViewSet.as_view({'post': 'generate'}),
        name='generate-report'
    ),
    
    path(
        'api/reports/<int:pk>/download/',
        AnalyticsReportViewSet.as_view({'get': 'download'}),
        name='download-report'
    ),
    
    path(
        'api/reports/<int:pk>/preview/',
        AnalyticsReportViewSet.as_view({'get': 'preview'}),
        name='preview-report'
    ),
    
    # Advanced analytics endpoints
    path(
        'api/analytics/real-time/',
        AnalyticsDashboardView.as_view(),
        {'real_time': True},
        name='real-time-analytics'
    ),
    
    path(
        'api/analytics/historical/',
        AnalyticsTrendsView.as_view(),
        name='historical-analytics'
    ),
    
    path(
        'api/analytics/predictive/',
        AnalyticsTrendsView.as_view(),
        {'predictive': True},
        name='predictive-analytics'
    ),
    
    # Channel-specific analytics
    path(
        'api/channels/<int:channel_id>/analytics/',
        AnalyticsDashboardView.as_view(),
        name='channel-analytics'
    ),
    
    path(
        'api/channels/<int:channel_id>/performance/',
        PerformanceMetricViewSet.as_view({'get': 'list'}),
        name='channel-performance'
    ),
    
    # Campaign-specific analytics
    path(
        'api/campaigns/<int:campaign_id>/analytics/',
        AnalyticsDashboardView.as_view(),
        name='campaign-analytics'
    ),
    
    path(
        'api/campaigns/<int:campaign_id>/performance/',
        PerformanceMetricViewSet.as_view({'get': 'list'}),
        name='campaign-performance'
    ),
    
    path(
        'api/campaigns/<int:campaign_id>/impressions/',
        ImpressionViewSet.as_view({'get': 'list'}),
        name='campaign-impressions'
    ),
    
    # Time-based analytics
    path(
        'api/analytics/hourly/',
        AnalyticsAggregationView.as_view(),
        {'aggregation': 'hourly'},
        name='hourly-analytics'
    ),
    
    path(
        'api/analytics/daily/',
        AnalyticsAggregationView.as_view(),
        {'aggregation': 'daily'},
        name='daily-analytics'
    ),
    
    path(
        'api/analytics/weekly/',
        AnalyticsAggregationView.as_view(),
        {'aggregation': 'weekly'},
        name='weekly-analytics'
    ),
    
    path(
        'api/analytics/monthly/',
        AnalyticsAggregationView.as_view(),
        {'aggregation': 'monthly'},
        name='monthly-analytics'
    ),
    
    # Provider-specific endpoints
    path(
        'api/providers/sfr/channels/',
        SfrAnalyticsViewSet.as_view({'get': 'channels'}),
        name='sfr-channels'
    ),
    
    path(
        'api/providers/bouygues/channels/',
        BouyguesAnalyticsViewSet.as_view({'get': 'channels'}),
        name='bouygues-channels'
    ),
    
    # Data quality endpoints
    path(
        'api/quality/validation/',
        AnalyticsHealthCheckView.as_view(),
        {'check_type': 'validation'},
        name='data-validation'
    ),
    
    path(
        'api/quality/completeness/',
        AnalyticsHealthCheckView.as_view(),
        {'check_type': 'completeness'},
        name='data-completeness'
    ),
    
    # Bulk operations
    path(
        'api/bulk/import/',
        AnalyticsExportView.as_view(),
        {'operation': 'import'},
        name='bulk-import'
    ),
    
    path(
        'api/bulk/export/',
        AnalyticsExportView.as_view(),
        {'operation': 'export'},
        name='bulk-export'
    ),
    
    # API documentation endpoints
    path(
        'api/docs/',
        AnalyticsConfigView.as_view(),
        {'doc_type': 'api'},
        name='api-documentation'
    ),
    
    path(
        'api/schema/',
        AnalyticsConfigView.as_view(),
        {'doc_type': 'schema'},
        name='api-schema'
    ),
]

# Apply format suffix patterns for content negotiation
urlpatterns = format_suffix_patterns(urlpatterns)

# Additional URL patterns for specific use cases
extra_patterns = [
    # WebSocket endpoints for real-time data
    # Note: These would typically be handled by Django Channels
    # path('ws/analytics/', AnalyticsConsumer.as_asgi()),
    
    # Webhook endpoints for external integrations
    path(
        'webhooks/analytics/',
        AnalyticsExportView.as_view(),
        {'webhook': True},
        name='analytics-webhook'
    ),
    
    # Health check endpoints for monitoring
    path(
        'health/analytics/',
        AnalyticsHealthCheckView.as_view(),
        name='analytics-health'
    ),
    
    # Metrics endpoints for monitoring systems
    path(
        'metrics/analytics/',
        AnalyticsMetricsView.as_view(),
        name='analytics-metrics'
    ),
]

# Combine all URL patterns
urlpatterns += extra_patterns

# URL pattern documentation
"""
URL Pattern Documentation
========================

This module defines comprehensive URL patterns for the Analytics app.
All endpoints are designed to be RESTful and follow Django REST Framework conventions.

Endpoint Categories:

1. Core Data Endpoints (/api/)
   - CRUD operations for all analytics models
   - Filtering, searching, and pagination support
   - Bulk operations support

2. Dashboard Endpoints (/api/dashboard/)
   - Real-time analytics data
   - Aggregated metrics
   - Trend analysis
   - Performance indicators

3. Export Endpoints (/api/export/)
   - Multiple format support (CSV, JSON, PDF, Excel)
   - Filtered data export
   - Scheduled exports
   - Bulk data operations

4. Utility Endpoints (/api/)
   - Health checks
   - System metrics
   - Configuration management
   - API documentation

5. Specialized Endpoints
   - Channel-specific analytics
   - Campaign-specific analytics
   - Time-based aggregations
   - Provider-specific data

Authentication:
All endpoints require authentication unless specifically noted.
Use Token authentication or Session authentication.

Permissions:
Endpoints respect user permissions and data access controls.
Some endpoints may require specific permissions.

Caching:
Many endpoints implement caching for performance optimization.
Cache duration varies based on data volatility.

Rate Limiting:
API endpoints implement rate limiting to prevent abuse.
Limits vary based on endpoint and user type.

Error Handling:
All endpoints return consistent error responses.
HTTP status codes follow REST conventions.

Pagination:
List endpoints support pagination with configurable page sizes.
Default page size is 20 items.

Filtering:
Most endpoints support filtering via query parameters.
Supported filters vary by endpoint and model.

Sorting:
List endpoints support sorting via 'ordering' parameter.
Multiple fields can be specified for complex sorting.

Search:
Text search is available on relevant endpoints.
Search fields vary by model and endpoint.

Versioning:
API versioning is handled via URL path.
Current version is v1 (implied).

Content Negotiation:
Endpoints support multiple content types.
Default is JSON, with support for XML and others.

WebSocket Support:
Real-time endpoints support WebSocket connections.
Requires Django Channels configuration.

Monitoring:
Health check and metrics endpoints support monitoring.
Integration with monitoring systems available.

Documentation:
API documentation available via dedicated endpoints.
Swagger/OpenAPI schema support included.
"""