# iptv_activation/utils.py

import requests
from .models import Channel, Tariff
import logging
from django.conf import settings
logger = logging.getLogger(__name__)

def fetch_and_update_channels():
    url = f"{settings.IPTV_BASE_URL}/channels"
    headers = {
        'accept': 'application/json',
        'Token': settings.IPTV_TOKEN,
    }

    response = requests.get(url, headers=headers)
    
    if response.status_code == 200:
        data = response.json()
        for item in data.get('channels', []):
            Channel.objects.update_or_create(
                channel_id=item['id'],  # use channel_id for lookup
                defaults={
                    'name': item.get('name', ''),
                    'order': int(item.get('order', 0)),
                    'link': item.get('link', ''),
                    'price': float(item.get('price', 0.00))
                }
            )
        return True, "Channels updated successfully."
    else:
        return False, f"Failed to fetch data: {response.status_code}"


def fetch_and_update_tariffs():
    url = f"{settings.IPTV_BASE_URL}/tariffs/"
    headers = {
        'accept': 'application/json',
        'Token':  settings.IPTV_TOKEN,
    }
    response = requests.get(url, headers=headers)
    
    if response.status_code == 200:
        data = response.json()
        for item in data.get('tariffs', []):
            Tariff.objects.update_or_create(
                tariffs_id=item['id'],  # Use tariffs_id as lookup field
                defaults={
                    'name': item.get('name', '')
                }
            )
        return True, "Tariffs updated successfully."
    else:
        return False, f"Failed to fetch data: {response.status_code}"


def create_iptv_client(payload):
    """
    Makes a POST request to create an IPTV client.
    Returns response JSON on success, or None on failure.
    """
    url = f"{settings.IPTV_BASE_URL}/clients/"
    headers = {
        "accept": "application/json",
        "Token":  settings.IPTV_TOKEN,
        "Content-Type": "application/json"
    }

    try:
        response = requests.post(url, json=payload, headers=headers)
        if response.status_code == 200:
            return response.json()
        else:
            logger.error(f"IPTV API Error {response.status_code}: {response.text}")
            return None
    except Exception as e:
        logger.exception(f"Exception while calling IPTV API: {str(e)}")
        return None
    

def update_iptv_client(payload,client_id):
    """
    Makes a POST request to create an IPTV client.
    Returns response JSON on success, or None on failure.
    """
    url = f"{settings.IPTV_BASE_URL}/clients/{client_id}/"

    headers = {
        "accept": "application/json",
        "Token": settings.IPTV_TOKEN ,
        "Content-Type": "application/json"
    }

    try:
        response = requests.patch(url, json=payload, headers=headers)
        if response.status_code in [200, 201]:
            return response.json()
        else:
            logger.error(f"IPTV update client API error {response.status_code}: {response.text}")
            return None
    except Exception as e:
        logger.exception(f"Exception while updating IPTV client: {str(e)}")
        return None
    


    
def add_device_code(client_id, code="", mac="", note="test"):
    url = f"{settings.IPTV_BASE_URL}/deviceCode/{client_id}"
    headers = {
        "accept": "application/json",
        "Token": settings.IPTV_TOKEN,
        "Content-Type": "application/json"
    }
    
    payload = {
        "code": code,
        "mac": mac,
        "type": "dtvsol",
        "proxyId": settings.IPTV_PROXY_SERVER_ID,
        "tariffId": settings.TARIFF_ID,
        "note": note
    }

    try:
        response = requests.post(url, json=payload, headers=headers)
        if response.status_code in [200, 201]:
            return response.json()
        else:
            logger.error(f"Device add API error {response.status_code}: {response.text}")
            return None
    except Exception as e:
        logger.exception(f"Exception while calling Device Add API: {str(e)}")
        return None
    
def get_device_code(client_id):
    url = f"{settings.IPTV_BASE_URL}/deviceCode/{client_id}"
    headers = {
        "accept": "application/json",
        "Token": settings.IPTV_TOKEN
    }

    try:
        response = requests.get(url, headers=headers)
        if response.status_code == 200:
            return response.json()
        else:
            logger.error(f"Device code fetch failed {response.status_code}: {response.text}")
            return None
    except Exception as e:
        logger.exception(f"Exception while fetching device code: {str(e)}")
        return None

def search_client_by_phone(phone):
    url = f"{settings.IPTV_BASE_URL}/search/name/phone/{phone}"
    headers = {
        "accept": "application/json",
        "Token": settings.IPTV_TOKEN  # You can also move this to settings as IPTV_SEARCH_TOKEN
    }

    try:
        response = requests.get(url, headers=headers)
        if response.status_code == 200:
            return response.json()
        else:
            logger.error(f"Search API failed {response.status_code}: {response.text}")
            return None
    except Exception as e:
        logger.exception(f"Exception while calling search API: {str(e)}")
        return None