# -*- coding: utf-8 -*-
"""
Advertisers App URLs

This module defines URL patterns for the Advertisers application.
It includes API endpoints for managing advertisers, agencies, brands,
contacts, agency users, and billing information.
"""

from django.urls import path, include
from rest_framework.routers import DefaultRouter
from rest_framework_nested import routers

from .views import (
    # ViewSets
    BrandCategoryViewSet,
    AgencyViewSet,
    AdvertiserViewSet,
    BrandViewSet,
    AdvertiserContactViewSet,
    AgencyUserViewSet,
    AdvertiserBillingViewSet,
    
    # API Views
    BrandCategoryListCreateAPIView,
    BrandCategoryRetrieveUpdateDestroyAPIView,
    AgencyListCreateAPIView,
    AgencyRetrieveUpdateDestroyAPIView,
    AdvertiserListCreateAPIView,
    AdvertiserRetrieveUpdateDestroyAPIView,
    BrandListCreateAPIView,
    BrandRetrieveUpdateDestroyAPIView,
    AdvertiserContactListCreateAPIView,
    AdvertiserContactRetrieveUpdateDestroyAPIView,
    AgencyUserListCreateAPIView,
    AgencyUserRetrieveUpdateDestroyAPIView,
    AdvertiserBillingListCreateAPIView,
    AdvertiserBillingRetrieveUpdateDestroyAPIView,
)

# App namespace
app_name = 'advertisers'

# Main router for primary resources
router = DefaultRouter()
router.register(r'categories', BrandCategoryViewSet, basename='brandcategory')
router.register(r'agencies', AgencyViewSet, basename='agency')
router.register(r'advertisers', AdvertiserViewSet, basename='advertiser')
router.register(r'brands', BrandViewSet, basename='brand')
router.register(r'contacts', AdvertiserContactViewSet, basename='advertisercontact')
router.register(r'agency-users', AgencyUserViewSet, basename='agencyuser')
router.register(r'billing', AdvertiserBillingViewSet, basename='advertiserbilling')

# Nested routers for related resources

# Agency nested routes
agency_router = routers.NestedDefaultRouter(router, r'agencies', lookup='agency')
agency_router.register(r'advertisers', AdvertiserViewSet, basename='agency-advertisers')
agency_router.register(r'users', AgencyUserViewSet, basename='agency-users')

# Advertiser nested routes
advertiser_router = routers.NestedDefaultRouter(router, r'advertisers', lookup='advertiser')
advertiser_router.register(r'brands', BrandViewSet, basename='advertiser-brands')
advertiser_router.register(r'contacts', AdvertiserContactViewSet, basename='advertiser-contacts')
advertiser_router.register(r'billing', AdvertiserBillingViewSet, basename='advertiser-billing')

# Brand Category nested routes
category_router = routers.NestedDefaultRouter(router, r'categories', lookup='category')
category_router.register(r'brands', BrandViewSet, basename='category-brands')
category_router.register(r'subcategories', BrandCategoryViewSet, basename='category-subcategories')

# URL patterns
urlpatterns = [
    # API v1 endpoints using ViewSets (recommended)
    path('api/v1/', include([
        # Main router URLs
        path('', include(router.urls)),
        
        # Nested router URLs
        path('', include(agency_router.urls)),
        path('', include(advertiser_router.urls)),
        path('', include(category_router.urls)),
        
        # Custom action endpoints
        path('categories/tree/', 
             BrandCategoryViewSet.as_view({'get': 'tree'}), 
             name='brandcategory-tree'),
        
        path('agencies/<int:pk>/statistics/', 
             AgencyViewSet.as_view({'get': 'statistics'}), 
             name='agency-statistics'),
        
        path('advertisers/<int:pk>/statistics/', 
             AdvertiserViewSet.as_view({'get': 'statistics'}), 
             name='advertiser-statistics'),
        
        path('brands/<int:pk>/campaigns/', 
             BrandViewSet.as_view({'get': 'campaigns'}), 
             name='brand-campaigns'),
        
        path('billing/<int:pk>/transactions/', 
             AdvertiserBillingViewSet.as_view({'get': 'transactions'}), 
             name='billing-transactions'),
        
        # Bulk operations
        path('categories/bulk-create/', 
             BrandCategoryViewSet.as_view({'post': 'bulk_create'}), 
             name='brandcategory-bulk-create'),
        
        path('brands/bulk-create/', 
             BrandViewSet.as_view({'post': 'bulk_create'}), 
             name='brand-bulk-create'),
        
        path('contacts/bulk-create/', 
             AdvertiserContactViewSet.as_view({'post': 'bulk_create'}), 
             name='contact-bulk-create'),
        
        # Export endpoints
        path('agencies/export/', 
             AgencyViewSet.as_view({'get': 'export'}), 
             name='agency-export'),
        
        path('advertisers/export/', 
             AdvertiserViewSet.as_view({'get': 'export'}), 
             name='advertiser-export'),
        
        path('brands/export/', 
             BrandViewSet.as_view({'get': 'export'}), 
             name='brand-export'),
        
        # Search endpoints
        path('search/agencies/', 
             AgencyViewSet.as_view({'get': 'search'}), 
             name='agency-search'),
        
        path('search/advertisers/', 
             AdvertiserViewSet.as_view({'get': 'search'}), 
             name='advertiser-search'),
        
        path('search/brands/', 
             BrandViewSet.as_view({'get': 'search'}), 
             name='brand-search'),
    ])),
    
    # Alternative API endpoints using APIViews (for specific use cases)
    path('api/v1/alt/', include([
        # Brand Categories
        path('categories/', 
             BrandCategoryListCreateAPIView.as_view(), 
             name='alt-brandcategory-list'),
        path('categories/<int:pk>/', 
             BrandCategoryRetrieveUpdateDestroyAPIView.as_view(), 
             name='alt-brandcategory-detail'),
        
        # Agencies
        path('agencies/', 
             AgencyListCreateAPIView.as_view(), 
             name='alt-agency-list'),
        path('agencies/<int:pk>/', 
             AgencyRetrieveUpdateDestroyAPIView.as_view(), 
             name='alt-agency-detail'),
        
        # Advertisers
        path('advertisers/', 
             AdvertiserListCreateAPIView.as_view(), 
             name='alt-advertiser-list'),
        path('advertisers/<int:pk>/', 
             AdvertiserRetrieveUpdateDestroyAPIView.as_view(), 
             name='alt-advertiser-detail'),
        
        # Brands
        path('brands/', 
             BrandListCreateAPIView.as_view(), 
             name='alt-brand-list'),
        path('brands/<int:pk>/', 
             BrandRetrieveUpdateDestroyAPIView.as_view(), 
             name='alt-brand-detail'),
        
        # Contacts
        path('contacts/', 
             AdvertiserContactListCreateAPIView.as_view(), 
             name='alt-contact-list'),
        path('contacts/<int:pk>/', 
             AdvertiserContactRetrieveUpdateDestroyAPIView.as_view(), 
             name='alt-contact-detail'),
        
        # Agency Users
        path('agency-users/', 
             AgencyUserListCreateAPIView.as_view(), 
             name='alt-agencyuser-list'),
        path('agency-users/<int:pk>/', 
             AgencyUserRetrieveUpdateDestroyAPIView.as_view(), 
             name='alt-agencyuser-detail'),
        
        # Billing
        path('billing/', 
             AdvertiserBillingListCreateAPIView.as_view(), 
             name='alt-billing-list'),
        path('billing/<int:pk>/', 
             AdvertiserBillingRetrieveUpdateDestroyAPIView.as_view(), 
             name='alt-billing-detail'),
    ])),
    
    # Legacy API endpoints (v0) - for backward compatibility
    path('api/v0/', include([
        # Simple endpoints for legacy systems
        path('categories/', 
             BrandCategoryListCreateAPIView.as_view(), 
             name='legacy-brandcategory-list'),
        
        path('agencies/', 
             AgencyListCreateAPIView.as_view(), 
             name='legacy-agency-list'),
        
        path('advertisers/', 
             AdvertiserListCreateAPIView.as_view(), 
             name='legacy-advertiser-list'),
        
        path('brands/', 
             BrandListCreateAPIView.as_view(), 
             name='legacy-brand-list'),
    ])),
    
    # Health check and status endpoints
    path('health/', include([
        path('categories/', 
             BrandCategoryViewSet.as_view({'get': 'health_check'}), 
             name='categories-health'),
        
        path('agencies/', 
             AgencyViewSet.as_view({'get': 'health_check'}), 
             name='agencies-health'),
        
        path('advertisers/', 
             AdvertiserViewSet.as_view({'get': 'health_check'}), 
             name='advertisers-health'),
        
        path('brands/', 
             BrandViewSet.as_view({'get': 'health_check'}), 
             name='brands-health'),
    ])),
]

# Additional URL patterns for specific features

# Webhook endpoints (if needed for external integrations)
webhook_patterns = [
    # Example webhook endpoints
    # path('webhooks/agency-created/', 
    #      AgencyWebhookView.as_view(), 
    #      name='agency-webhook'),
    # path('webhooks/advertiser-updated/', 
    #      AdvertiserWebhookView.as_view(), 
    #      name='advertiser-webhook'),
]

# Admin integration endpoints
admin_patterns = [
    # Custom admin actions
    # path('admin/bulk-import/', 
    #      BulkImportView.as_view(), 
    #      name='admin-bulk-import'),
    # path('admin/data-export/', 
    #      DataExportView.as_view(), 
    #      name='admin-data-export'),
]

# Add webhook and admin patterns if needed
# urlpatterns += webhook_patterns
# urlpatterns += admin_patterns

# URL pattern names for reverse lookups
URL_NAMES = {
    # ViewSet URLs
    'brandcategory_list': 'advertisers:brandcategory-list',
    'brandcategory_detail': 'advertisers:brandcategory-detail',
    'agency_list': 'advertisers:agency-list',
    'agency_detail': 'advertisers:agency-detail',
    'advertiser_list': 'advertisers:advertiser-list',
    'advertiser_detail': 'advertisers:advertiser-detail',
    'brand_list': 'advertisers:brand-list',
    'brand_detail': 'advertisers:brand-detail',
    'contact_list': 'advertisers:advertisercontact-list',
    'contact_detail': 'advertisers:advertisercontact-detail',
    'agencyuser_list': 'advertisers:agencyuser-list',
    'agencyuser_detail': 'advertisers:agencyuser-detail',
    'billing_list': 'advertisers:advertiserbilling-list',
    'billing_detail': 'advertisers:advertiserbilling-detail',
    
    # Custom action URLs
    'brandcategory_tree': 'advertisers:brandcategory-tree',
    'agency_statistics': 'advertisers:agency-statistics',
    'advertiser_statistics': 'advertisers:advertiser-statistics',
    'brand_campaigns': 'advertisers:brand-campaigns',
    'billing_transactions': 'advertisers:billing-transactions',
    
    # Nested URLs
    'agency_advertisers': 'advertisers:agency-advertisers-list',
    'agency_users': 'advertisers:agency-users-list',
    'advertiser_brands': 'advertisers:advertiser-brands-list',
    'advertiser_contacts': 'advertisers:advertiser-contacts-list',
    'advertiser_billing': 'advertisers:advertiser-billing-list',
    'category_brands': 'advertisers:category-brands-list',
    'category_subcategories': 'advertisers:category-subcategories-list',
}