"""
Development-only endpoint for generating referral test URLs.
This endpoint auto-generates user IDs and creates signed initData for testing.
"""
import time
from urllib.parse import quote
from django.conf import settings
from rest_framework import status
from rest_framework.decorators import api_view, permission_classes
from rest_framework.permissions import AllowAny
from rest_framework.response import Response
from drf_spectacular.utils import extend_schema, OpenApiResponse
from utils.telegram import generate_signed_init_data


@extend_schema(
    summary="Generate referral test URL (dev only)",
    description="Auto-generates a unique user ID and creates a signed initData URL for testing referrals. Only available in development mode.",
    request={
        "application/json": {
            "type": "object",
            "properties": {
                "first_name": {"type": "string", "description": "First name for the test user"},
                "username": {"type": "string", "description": "Username for the test user (optional)"},
                "referral_code": {"type": "string", "description": "Referral code of the referrer"},
            },
            "required": ["first_name", "referral_code"],
        }
    },
    responses={
        200: OpenApiResponse(
            description="Test URL generated successfully",
            response={
                "type": "object",
                "properties": {
                    "url": {"type": "string", "description": "Full browser URL with encoded initData"},
                    "user_id": {"type": "integer", "description": "Auto-generated user ID"},
                    "init_data": {"type": "string", "description": "Raw initData string"},
                },
            },
        ),
        404: OpenApiResponse(description="Endpoint not available (production mode)"),
        400: OpenApiResponse(description="Invalid request data"),
    },
)
@api_view(["POST"])
@permission_classes([AllowAny])
def generate_referral_test_url(request):
    """
    DEV ONLY: Generate a test URL for referral testing.
    
    Auto-generates a unique user_id and creates signed initData.
    Returns a complete browser URL ready to paste for testing.
    """
    # CRITICAL: Only allow in development mode
    if not (settings.DEBUG and getattr(settings, "ENABLE_DEV_TELEGRAM_AUTH", False)):
        return Response(status=status.HTTP_404_NOT_FOUND)
    
    # Validate required fields
    first_name = request.data.get("first_name")
    referral_code = request.data.get("referral_code")
    
    if not first_name or not referral_code:
        return Response(
            {"error": "first_name and referral_code are required"},
            status=status.HTTP_400_BAD_REQUEST,
        )
    
    # Optional fields
    username = request.data.get("username", "")
    language_code = request.data.get("language_code", "en")
    
    # Auto-generate a unique user_id using timestamp with microseconds and random component
    # This ensures uniqueness even for rapid successive calls
    import random
    timestamp_part = int(time.time() * 1000000) % 1000000000  # Use microseconds
    random_part = random.randint(0, 999)
    user_id = timestamp_part + random_part
    
    # Build user data
    user_data = {
        "id": user_id,
        "first_name": first_name,
        "language_code": language_code,
    }
    
    if username:
        user_data["username"] = username
    
    # Generate signed initData
    try:
        signed_data = generate_signed_init_data(
            user=user_data,
            bot_token=settings.TELEGRAM_BOT_TOKEN,
            start_param=referral_code,
        )
        
        init_data_str = signed_data["init_data"]
        
        # URL-encode the initData for browser hash
        encoded_init_data = quote(init_data_str, safe='')
        
        # Build the full browser URL
        frontend_url = getattr(settings, "TELEGRAM_WEBAPP_URL", "http://localhost:5173")
        browser_url = f"{frontend_url}/#tgWebAppData={encoded_init_data}&tgWebAppVersion=7.0&tgWebAppPlatform=weba"
        
        return Response({
            "url": browser_url,
            "user_id": user_id,
            "init_data": init_data_str,
            "first_name": first_name,
            "username": username,
            "referral_code": referral_code,
        })
        
    except Exception as e:
        return Response(
            {"error": f"Failed to generate test URL: {str(e)}"},
            status=status.HTTP_500_INTERNAL_SERVER_ERROR,
        )
