# -*- coding: utf-8 -*-
"""
Accounts URL Configuration

This module defines URL patterns for the accounts application,
including authentication, user management, role and permission management,
and security monitoring endpoints.

URL patterns included:
- Authentication URLs (login, logout, password management)
- User management URLs (profile, user list, user detail)
- Role and permission management URLs
- Security monitoring URLs (logs, sessions)
- API endpoints for AJAX requests

Author: Adtlas Development Team
Version: 1.0.0
Created: 2024
"""

from django.urls import path, include
from django.contrib.auth import views as auth_views
from django.views.generic import TemplateView

from . import views

# Define the app namespace
app_name = 'accounts'

# ============================================================================
# Authentication URL Patterns
# ============================================================================

authentication_patterns = [
    # Login and logout
    path('login/', views.login_view, name='login'),
    path('logout/', views.logout_view, name='logout'),
    
    # Password management
    path('password/change/', views.change_password, name='password_change'),
    path('password/reset/', views.password_reset_request, name='password_reset'),
    path('password/reset/confirm/<uidb64>/<token>/', 
         auth_views.PasswordResetConfirmView.as_view(
             template_name='accounts/password_reset_confirm.html',
             success_url='/accounts/login/?password_reset=success'
         ), 
         name='password_reset_confirm'),
    path('password/reset/complete/', 
         TemplateView.as_view(template_name='accounts/password_reset_complete.html'),
         name='password_reset_complete'),
]

# ============================================================================
# User Management URL Patterns
# ============================================================================

user_management_patterns = [
    # User profile
    path('profile/', views.profile_view, name='profile'),
    path('profile/edit/', views.profile_view, name='profile_edit'),
    
    # User management (admin)
    path('users/', views.user_list, name='user_list'),
    path('users/<int:user_id>/', views.user_detail, name='user_detail'),
    path('users/<int:user_id>/edit/', views.user_detail, name='user_edit'),
    path('users/create/', 
         TemplateView.as_view(template_name='accounts/user_create.html'),
         name='user_create'),
    
    # User role assignments
    path('users/<int:user_id>/roles/', 
         TemplateView.as_view(template_name='accounts/user_roles.html'),
         name='user_roles'),
    path('users/<int:user_id>/roles/add/', 
         TemplateView.as_view(template_name='accounts/user_role_add.html'),
         name='user_role_add'),
    path('users/<int:user_id>/roles/<int:role_id>/remove/', 
         TemplateView.as_view(template_name='accounts/user_role_remove.html'),
         name='user_role_remove'),
]

# ============================================================================
# Role and Permission Management URL Patterns
# ============================================================================

role_permission_patterns = [
    # Role management
    path('roles/', views.role_list, name='role_list'),
    path('roles/create/', views.role_create, name='role_create'),
    path('roles/<int:role_id>/', 
         TemplateView.as_view(template_name='accounts/role_detail.html'),
         name='role_detail'),
    path('roles/<int:role_id>/edit/', views.role_edit, name='role_edit'),
    path('roles/<int:role_id>/delete/', 
         TemplateView.as_view(template_name='accounts/role_delete.html'),
         name='role_delete'),
    
    # Permission management
    path('permissions/', views.permission_list, name='permission_list'),
    path('permissions/create/', 
         TemplateView.as_view(template_name='accounts/permission_create.html'),
         name='permission_create'),
    path('permissions/<int:permission_id>/', 
         TemplateView.as_view(template_name='accounts/permission_detail.html'),
         name='permission_detail'),
    path('permissions/<int:permission_id>/edit/', 
         TemplateView.as_view(template_name='accounts/permission_edit.html'),
         name='permission_edit'),
    path('permissions/<int:permission_id>/delete/', 
         TemplateView.as_view(template_name='accounts/permission_delete.html'),
         name='permission_delete'),
    
    # Permission groups
    path('permission-groups/', 
         TemplateView.as_view(template_name='accounts/permission_group_list.html'),
         name='permission_group_list'),
    path('permission-groups/create/', 
         TemplateView.as_view(template_name='accounts/permission_group_create.html'),
         name='permission_group_create'),
    path('permission-groups/<int:group_id>/', 
         TemplateView.as_view(template_name='accounts/permission_group_detail.html'),
         name='permission_group_detail'),
    path('permission-groups/<int:group_id>/edit/', 
         TemplateView.as_view(template_name='accounts/permission_group_edit.html'),
         name='permission_group_edit'),
]

# ============================================================================
# Security Monitoring URL Patterns
# ============================================================================

security_patterns = [
    # Security logs
    path('security/logs/', views.security_logs, name='security_logs'),
    path('security/logs/<int:log_id>/', 
         TemplateView.as_view(template_name='accounts/security_log_detail.html'),
         name='security_log_detail'),
    
    # Active sessions
    path('security/sessions/', views.active_sessions, name='active_sessions'),
    path('security/sessions/my/', 
         TemplateView.as_view(template_name='accounts/my_sessions.html'),
         name='my_sessions'),
    
    # Security dashboard
    path('security/dashboard/', 
         TemplateView.as_view(template_name='accounts/security_dashboard.html'),
         name='security_dashboard'),
    
    # Security reports
    path('security/reports/', 
         TemplateView.as_view(template_name='accounts/security_reports.html'),
         name='security_reports'),
    path('security/reports/login-attempts/', 
         TemplateView.as_view(template_name='accounts/login_attempts_report.html'),
         name='login_attempts_report'),
    path('security/reports/user-activity/', 
         TemplateView.as_view(template_name='accounts/user_activity_report.html'),
         name='user_activity_report'),
]

# ============================================================================
# API Key Management URL Patterns
# ============================================================================

api_key_patterns = [
    # API key management
    path('api-keys/', 
         TemplateView.as_view(template_name='accounts/api_key_list.html'),
         name='api_key_list'),
    path('api-keys/create/', 
         TemplateView.as_view(template_name='accounts/api_key_create.html'),
         name='api_key_create'),
    path('api-keys/<int:key_id>/', 
         TemplateView.as_view(template_name='accounts/api_key_detail.html'),
         name='api_key_detail'),
    path('api-keys/<int:key_id>/edit/', 
         TemplateView.as_view(template_name='accounts/api_key_edit.html'),
         name='api_key_edit'),
    path('api-keys/<int:key_id>/revoke/', 
         TemplateView.as_view(template_name='accounts/api_key_revoke.html'),
         name='api_key_revoke'),
]

# ============================================================================
# User Access Management URL Patterns
# ============================================================================

user_access_patterns = [
    # External service access
    path('access/', 
         TemplateView.as_view(template_name='accounts/user_access_list.html'),
         name='user_access_list'),
    path('access/create/', 
         TemplateView.as_view(template_name='accounts/user_access_create.html'),
         name='user_access_create'),
    path('access/<int:access_id>/', 
         TemplateView.as_view(template_name='accounts/user_access_detail.html'),
         name='user_access_detail'),
    path('access/<int:access_id>/edit/', 
         TemplateView.as_view(template_name='accounts/user_access_edit.html'),
         name='user_access_edit'),
    path('access/<int:access_id>/test/', 
         TemplateView.as_view(template_name='accounts/user_access_test.html'),
         name='user_access_test'),
    path('access/<int:access_id>/delete/', 
         TemplateView.as_view(template_name='accounts/user_access_delete.html'),
         name='user_access_delete'),
]

# ============================================================================
# AJAX API URL Patterns
# ============================================================================

api_patterns = [
    # Session management API
    path('api/sessions/terminate/', views.terminate_session, name='api_terminate_session'),
    path('api/sessions/list/', 
         TemplateView.as_view(template_name='accounts/api_sessions.html'),
         name='api_session_list'),
    
    # API key management API
    path('api/api-keys/generate/', views.generate_api_key_view, name='api_generate_key'),
    path('api/api-keys/revoke/', views.revoke_api_key, name='api_revoke_key'),
    path('api/api-keys/list/', 
         TemplateView.as_view(template_name='accounts/api_key_list_json.html'),
         name='api_key_list_json'),
    
    # User management API
    path('api/users/stats/', views.user_stats_api, name='api_user_stats'),
    path('api/users/search/', 
         TemplateView.as_view(template_name='accounts/api_user_search.html'),
         name='api_user_search'),
    path('api/users/<int:user_id>/roles/', 
         TemplateView.as_view(template_name='accounts/api_user_roles.html'),
         name='api_user_roles'),
    
    # Role and permission API
    path('api/roles/list/', 
         TemplateView.as_view(template_name='accounts/api_role_list.html'),
         name='api_role_list'),
    path('api/permissions/list/', 
         TemplateView.as_view(template_name='accounts/api_permission_list.html'),
         name='api_permission_list'),
    path('api/permissions/check/', 
         TemplateView.as_view(template_name='accounts/api_permission_check.html'),
         name='api_permission_check'),
    
    # Security API
    path('api/security/logs/', 
         TemplateView.as_view(template_name='accounts/api_security_logs.html'),
         name='api_security_logs'),
    path('api/security/stats/', 
         TemplateView.as_view(template_name='accounts/api_security_stats.html'),
         name='api_security_stats'),
    
    # User access API
    path('api/access/test/', 
         TemplateView.as_view(template_name='accounts/api_access_test.html'),
         name='api_access_test'),
    path('api/access/list/', 
         TemplateView.as_view(template_name='accounts/api_access_list.html'),
         name='api_access_list'),
]

# ============================================================================
# Settings and Preferences URL Patterns
# ============================================================================

settings_patterns = [
    # User settings
    path('settings/', 
         TemplateView.as_view(template_name='accounts/settings.html'),
         name='settings'),
    path('settings/profile/', 
         TemplateView.as_view(template_name='accounts/settings_profile.html'),
         name='settings_profile'),
    path('settings/security/', 
         TemplateView.as_view(template_name='accounts/settings_security.html'),
         name='settings_security'),
    path('settings/notifications/', 
         TemplateView.as_view(template_name='accounts/settings_notifications.html'),
         name='settings_notifications'),
    path('settings/privacy/', 
         TemplateView.as_view(template_name='accounts/settings_privacy.html'),
         name='settings_privacy'),
    
    # Two-factor authentication
    path('settings/2fa/', 
         TemplateView.as_view(template_name='accounts/settings_2fa.html'),
         name='settings_2fa'),
    path('settings/2fa/enable/', 
         TemplateView.as_view(template_name='accounts/2fa_enable.html'),
         name='2fa_enable'),
    path('settings/2fa/disable/', 
         TemplateView.as_view(template_name='accounts/2fa_disable.html'),
         name='2fa_disable'),
    path('settings/2fa/backup-codes/', 
         TemplateView.as_view(template_name='accounts/2fa_backup_codes.html'),
         name='2fa_backup_codes'),
]

# ============================================================================
# Admin and Management URL Patterns
# ============================================================================

admin_patterns = [
    # Admin dashboard
    path('admin/dashboard/', 
         TemplateView.as_view(template_name='accounts/admin_dashboard.html'),
         name='admin_dashboard'),
    
    # System settings
    path('admin/settings/', 
         TemplateView.as_view(template_name='accounts/admin_settings.html'),
         name='admin_settings'),
    path('admin/settings/security/', 
         TemplateView.as_view(template_name='accounts/admin_security_settings.html'),
         name='admin_security_settings'),
    path('admin/settings/authentication/', 
         TemplateView.as_view(template_name='accounts/admin_auth_settings.html'),
         name='admin_auth_settings'),
    
    # User management (admin)
    path('admin/users/', 
         TemplateView.as_view(template_name='accounts/admin_user_management.html'),
         name='admin_user_management'),
    path('admin/users/bulk-actions/', 
         TemplateView.as_view(template_name='accounts/admin_user_bulk_actions.html'),
         name='admin_user_bulk_actions'),
    path('admin/users/import/', 
         TemplateView.as_view(template_name='accounts/admin_user_import.html'),
         name='admin_user_import'),
    path('admin/users/export/', 
         TemplateView.as_view(template_name='accounts/admin_user_export.html'),
         name='admin_user_export'),
    
    # Role templates
    path('admin/role-templates/', 
         TemplateView.as_view(template_name='accounts/admin_role_templates.html'),
         name='admin_role_templates'),
    path('admin/role-templates/create/', 
         TemplateView.as_view(template_name='accounts/admin_role_template_create.html'),
         name='admin_role_template_create'),
    
    # System monitoring
    path('admin/monitoring/', 
         TemplateView.as_view(template_name='accounts/admin_monitoring.html'),
         name='admin_monitoring'),
    path('admin/monitoring/performance/', 
         TemplateView.as_view(template_name='accounts/admin_performance.html'),
         name='admin_performance'),
    path('admin/monitoring/errors/', 
         TemplateView.as_view(template_name='accounts/admin_errors.html'),
         name='admin_errors'),
]

# ============================================================================
# Help and Documentation URL Patterns
# ============================================================================

help_patterns = [
    # Help pages
    path('help/', 
         TemplateView.as_view(template_name='accounts/help_index.html'),
         name='help_index'),
    path('help/getting-started/', 
         TemplateView.as_view(template_name='accounts/help_getting_started.html'),
         name='help_getting_started'),
    path('help/user-guide/', 
         TemplateView.as_view(template_name='accounts/help_user_guide.html'),
         name='help_user_guide'),
    path('help/admin-guide/', 
         TemplateView.as_view(template_name='accounts/help_admin_guide.html'),
         name='help_admin_guide'),
    path('help/security/', 
         TemplateView.as_view(template_name='accounts/help_security.html'),
         name='help_security'),
    path('help/api/', 
         TemplateView.as_view(template_name='accounts/help_api.html'),
         name='help_api'),
    path('help/troubleshooting/', 
         TemplateView.as_view(template_name='accounts/help_troubleshooting.html'),
         name='help_troubleshooting'),
    
    # FAQ
    path('faq/', 
         TemplateView.as_view(template_name='accounts/faq.html'),
         name='faq'),
    
    # Contact and support
    path('support/', 
         TemplateView.as_view(template_name='accounts/support.html'),
         name='support'),
    path('contact/', 
         TemplateView.as_view(template_name='accounts/contact.html'),
         name='contact'),
]

# ============================================================================
# Main URL Patterns
# ============================================================================

urlpatterns = [
    # Root redirect
    path('', TemplateView.as_view(template_name='accounts/index.html'), name='index'),
    
    # Include all pattern groups
    path('auth/', include(authentication_patterns)),
    path('', include(authentication_patterns)),  # Also include at root level
    path('', include(user_management_patterns)),
    path('', include(role_permission_patterns)),
    path('', include(security_patterns)),
    path('', include(api_key_patterns)),
    path('', include(user_access_patterns)),
    path('', include(api_patterns)),
    path('', include(settings_patterns)),
    path('', include(admin_patterns)),
    path('', include(help_patterns)),
    
    # Dashboard
    path('dashboard/', 
         TemplateView.as_view(template_name='accounts/dashboard.html'),
         name='dashboard'),
    
    # Account activation (for email verification)
    path('activate/<uidb64>/<token>/', 
         TemplateView.as_view(template_name='accounts/account_activation.html'),
         name='account_activation'),
    
    # Terms and privacy
    path('terms/', 
         TemplateView.as_view(template_name='accounts/terms.html'),
         name='terms'),
    path('privacy/', 
         TemplateView.as_view(template_name='accounts/privacy.html'),
         name='privacy'),
    
    # Health check endpoint
    path('health/', 
         TemplateView.as_view(template_name='accounts/health.html'),
         name='health'),
]

# ============================================================================
# Error Handlers (Optional)
# ============================================================================

# Custom error handlers can be defined here if needed
# handler404 = 'apps.accounts.views.custom_404'
# handler500 = 'apps.accounts.views.custom_500'
# handler403 = 'apps.accounts.views.custom_403'