from django.http import JsonResponse
from .models import Channel
from django.contrib import messages
from .utils import fetch_and_update_channels,fetch_and_update_tariffs, create_iptv_client , update_iptv_client, add_device_code, get_device_code, search_client_by_phone
from django.shortcuts import redirect
import logging
from django.conf import settings
from datetime import timedelta
from django.utils import timezone
from .models import IPTVActivationLog, SkylinkIPTVPlan


logger = logging.getLogger(__name__)


def channel_list(request):
    channels = Channel.objects.all().values('id', 'name', 'order', 'link', 'price')
    return JsonResponse(list(channels), safe=False)



def update_channels_view(request):
    success, message = fetch_and_update_channels()
    return JsonResponse({'success': success, 'message': message})

def update_tariffs(request):
    """
    View to fetch and update tariffs from the API.
    Triggered by a button click in the Django admin.
    """
    success, msg = fetch_and_update_tariffs()
    
    # Display success or error message in the admin
    level = messages.SUCCESS if success else messages.ERROR
    messages.add_message(request, level, msg)
    
    # Redirect back to the admin page after the operation
    return redirect("..") 
def request_iptv(request):
    # Allow only GET requests
    if request.method != "GET":
        return JsonResponse({'success': False, 'message': 'Invalid request'})

    try:
        session = request.session
        client_data = session.get('display_param', [{}])[0]
        client_id, phone, email = client_data.get('id'), client_data.get('phone'), client_data.get('email')
        
        phone = 9715121790
        # Basic validation for essential session data
        if not client_id or not phone:
            return JsonResponse({'success': False, 'message': 'Session data missing'})
        
        # Get IPTV client ID if passed explicitly from frontend
        iptv_client_id = request.GET.get('iptv_client_id')
        #iptv_client_id = 35265

        if not iptv_client_id:
            # No IPTV client ID provided, search using phone
            search_result = search_client_by_phone(phone)
            if not search_result or search_result.get("result") != "ok":
                return JsonResponse({'success': False, 'message': 'Failed to fetch client list'})

            names = search_result.get("names", [])
            if len(names) == 0:
                return JsonResponse({'success': False, 'message': 'No client found with this phone number'})

            if len(names) > 1:
                # Return list for user to choose from
                return JsonResponse({
                    'success': False,
                    'multiple': True,
                    'message': 'Multiple clients found. Please select one.',
                    'clients': names
                })

            # Single client found
            iptv_client_id = names[0]['id']
        
        
        
        # Check if the IPTV client ID exists and is not expired in the log table
      
        # Ensure that the expired_date is timezone-aware
        log_entry = IPTVActivationLog.objects.filter(
                client_id=iptv_client_id,
                activation_code__isnull=False,
                expired_date__isnull=False
            ).order_by('-id').first()

        if log_entry and log_entry.expired_date and log_entry.expired_date > timezone.now():
            return JsonResponse({
                'success': True,
                'message': f'IPTV already activated. Your activation code is {log_entry.activation_code}'
            })
       
            
        # Get plan amount and billing cycle from session
        amount = session.get('skylink_plan_amount', 0)
        billing_cycle = int(session.get('billing_cycle', 1) or 1)

        # Convert amount to float (default to 0.0 if invalid)
        try:
            amount = float(amount)
        except ValueError:
            amount = 0.0

        # Divide amount if billing is recurring
        if billing_cycle > 1:
            amount /= billing_cycle

        # Fetch IPTV plan based on amount and status
        plan = SkylinkIPTVPlan.objects.filter(amount=amount, status='active').prefetch_related('tariffs').first()
        tariff_id = plan.tariffs.first().id if plan and plan.tariffs.exists() else settings.TARIFF_ID

        # Prepare client creation/update payload
        payload = {
            "name": client_data.get('name', ''),
            "nie": "test",
            "address": client_data.get('address_city', ''),
            "phone": phone,
            "email": email,
            "vip": False,
            "vod": True,
            "timeshift": True,
            "note": "It is test data",
            "limit": settings.IPTV_LIMIT,
            "data": {
                "proxyServerId": settings.IPTV_PROXY_SERVER_ID,
                "tariffId": tariff_id
            }
        }

        output_log = {}

        

        # Check if user already exists (this can be made dynamic)
        
        existing_user = True

        

        # Update or create IPTV client
        if existing_user:
            endpoint = f"{settings.IPTV_BASE_URL}/clients/{iptv_client_id}/"
            response_data = update_iptv_client(payload, iptv_client_id)
            output_log['update_client'] = {"flag": 2, "endpoint": endpoint, "request": payload, "response": response_data}
            output_log['add_client'] = {}
        else:
            endpoint = f"{settings.IPTV_BASE_URL}/clients/"
            response_data = create_iptv_client(payload)
            output_log['add_client'] = {"flag": 1, "endpoint": endpoint, "request": payload, "response": response_data}
            output_log['update_client'] = {}

        # Prepare and send device code request
        device_payload = {
            "code": "", "mac": "", "type": "dtvsol",
            "proxyId": settings.IPTV_PROXY_SERVER_ID,
            "tariffId": tariff_id, "note": "test"
        }
        device_endpoint = f"{settings.IPTV_BASE_URL}/deviceCode/{iptv_client_id}"
        device_response = add_device_code(iptv_client_id, code="", mac="")

        output_log['add_device'] = {
            "endpoint": device_endpoint,
            "request": device_payload,
            "response": device_response
        }

        # Handle device code success or failure
        # Fetch device code if device was added successfully
        if device_response.get("result") == "ok":
            code_data = get_device_code(iptv_client_id)
            device_code = code_data.get("deviceCode", "Unknown") if code_data else "Unknown"
            output_log['get_device_code'] = {
                "endpoint": device_endpoint,
                "request": {},
                "response": code_data
            }
        else:
            message = 'Failed to add device.'
            IPTVActivationLog.objects.create(
                client_id=iptv_client_id,
                phone_number=phone,
                status="Failed",
                message=message,
                input=payload,
                output=output_log,
                endpoint=device_endpoint
            )
            return JsonResponse({'success': False, 'message': message})

        # Calculate expiration date (current date + 30 days)
        expired_date = timezone.now() + timedelta(days=30)
        # Save success log
        IPTVActivationLog.objects.create(
            client_id=iptv_client_id,
            phone_number=phone,
            status="Success",
            message="IPTV activated successfully.",
            input=payload,
            output=output_log,
            response_status=200,
            endpoint="All APIs Used",
            expired_date=expired_date,  # Store the expiration date
            activation_code=device_code,  # Store the activation code
        )

        # ✅ Use device_code as activation code now
        activation_code = device_code

        return JsonResponse({
            'success': True,
            'message': f'IPTV activated successfully. Your activation code is {activation_code}'
        })

    except Exception as e:
        logger.error(f"IPTV request failed: {str(e)}")
        return JsonResponse({'success': False, 'message': 'Something went wrong while processing your request. Please try again later.'})
