import requests
import time
import base64
import re
import urllib3

urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning)

COMMON_HEADERS = {
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/136.0.0.0 Safari/537.36",
    "Accept-Language": "en-US,en;q=0.9",
    "Sec-Ch-Ua": '"Not.A/Brand";v="99", "Chromium";v="136"',
    "Sec-Ch-Ua-Platform": '"Windows"',
    "Accept-Encoding": "gzip, deflate, br"
}

def get_apple_cap():
    s = requests.Session()
    s.headers.update(COMMON_HEADERS)
    loc = "en_CA"
    html_content = ""
    csrf_token = ""
    for attempt in range(3):
        try:
            s.headers.update({
                "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8",
                "Upgrade-Insecure-Requests": "1",
                "Sec-Fetch-Dest": "document",
                "Sec-Fetch-Mode": "navigate",
                "Sec-Fetch-Site": "none",
                "Sec-Fetch-User": "?1"
            })
            r_main = s.get(f"https://checkcoverage.apple.com/?locale={loc}", verify=False, timeout=10)
            if r_main.status_code == 200:
                if "support-wewillbeback.gif" in r_main.text or "AkamaiNetStorage" in r_main.headers.get("Server", ""):
                    time.sleep(3)
                    continue
                html_content = r_main.text
                csrf_match = re.search(r'"csrfToken"\s*:\s*"([^"]+)"', html_content)
                if not csrf_match:
                    csrf_match = re.search(r'(eyJhbGciOiJIUzI1NiIs[a-zA-Z0-9_.-]+)', html_content)
                if csrf_match:
                    csrf_token = csrf_match.group(1) if len(csrf_match.groups()) > 0 else csrf_match.group(0)
                break
            else: time.sleep(3)
        except Exception as e:
            time.sleep(3)
    if not html_content: return None, {}, '', ''
    
    try:
        s.headers.update({
            "Accept": "application/json",
            "Content-Type": "application/json",
            "Sec-Fetch-Dest": "empty",
            "Sec-Fetch-Mode": "cors",
            "Sec-Fetch-Site": "same-origin",
            "Referer": f"https://checkcoverage.apple.com/?locale={loc}",
            "Origin": "https://checkcoverage.apple.com"
        })
        if csrf_token: s.headers["X-Apple-Csrf-Token"] = csrf_token
        
        r_cap = s.get(f"https://checkcoverage.apple.com/api/v1/captcha?locale={loc}", verify=False, timeout=10)
        if r_cap.status_code == 200:
            data = r_cap.json()
            img_b64 = data.get('data', {}).get('binary')
            if img_b64:
                ck = s.cookies.get_dict()
                new_csrf = r_cap.headers.get('X-Apple-Csrf-Token', csrf_token)
                return base64.b64decode(img_b64), ck, new_csrf, loc
    except Exception as e: pass
    return None, {}, '', ''

def parse_apple_coverage(text):
    text_clean = text.replace('\\"', '"').replace('\\\\', '\\')
    device_name = "Unknown Device"
    cov_status = "Unknown"
    dop = "N/A"
    expiry = "N/A"
    cov_type = "NONE"
    open_repair = "false"
    is_valid = False

    m_prod = re.search(r'"product"\s*:\s*\{\s*"list"\s*:\s*\[\s*"([^"]+)"', text_clean)
    if m_prod:
        device_name = m_prod.group(1).split('::')[-1].strip()
        is_valid = True
    else:
        m_dom = re.search(r'"id"\s*:\s*"device-header-title"[^}]*?"children"\s*:\s*"([^"]+)"', text_clean)
        if m_dom: 
            device_name = m_dom.group(1).strip()
            is_valid = True
        else:
            m_html = re.search(r'id="device-header-title"[^>]*>([^<]+)<', text_clean)
            if m_html: 
                device_name = m_html.group(1).strip()
                is_valid = True

    m_dop = re.search(r'"dop"\s*:\s*"([^"]+)"', text_clean)
    if m_dop: 
        dop = m_dop.group(1).strip()
        is_valid = True

    m_val = re.search(r'"validityLabel"\s*:\s*"([^"]+)"', text_clean)
    if m_val: 
        raw_expiry = m_val.group(1).strip()
        expiry = re.sub(r'^(?i)(expired|expires)\s+', '', raw_expiry)

    m_title = re.search(r'"agreement"\s*:\s*\{\s*"title"\s*:\s*"([^"]+)"', text_clean)
    if m_title:
        cov_status = m_title.group(1).strip()
    else:
        m_banner = re.search(r'"banners"\s*:\s*\{\s*"id"\s*:\s*\[\s*"([^"]+)"', text_clean)
        if m_banner: 
            cov_status = m_banner.group(1).strip()
        else:
            m_notif = re.search(r'"data-testid"\s*:\s*"notification-heading"[^}]*?"children"\s*:\s*(?:\[[^,]+,\s*)?"([^"]+)"', text_clean)
            if m_notif: cov_status = m_notif.group(1).strip()
            elif "Active" in text_clean: cov_status = "Active"
            elif "Expired" in text_clean: cov_status = "Expired"

    m_type = re.search(r'"coverageType"\s*:\s*"([^"]+)"', text_clean)
    if m_type: cov_type = m_type.group(1).strip()
    
    m_repair = re.search(r'"openRepair"\s*:\s*(true|false)', text_clean)
    if m_repair: open_repair = m_repair.group(1)

    return {
        'goods_name': device_name,
        'coverage_status': cov_status,
        'dop': dop,
        'expiry': expiry,
        'coverage_type': cov_type,
        'open_repair': open_repair,
        'is_valid': is_valid
    }

def call_apple(sn, cap_val, ck, csrf, loc="en_CA"):
    s = requests.Session()
    s.cookies.update(ck)
    s.cookies.set('cclocale', loc, domain='.apple.com')
    s.headers.update(COMMON_HEADERS)
    s.headers.update({
        "Content-Type": "application/json",
        "Accept": "application/json, text/plain, */*",
        "Origin": "https://checkcoverage.apple.com",
        "Referer": f"https://checkcoverage.apple.com/?locale={loc}",
        "Sec-Fetch-Dest": "empty",
        "Sec-Fetch-Mode": "cors",
        "Sec-Fetch-Site": "same-origin"
    })
    if csrf: s.headers["X-Apple-Csrf-Token"] = csrf
    
    try:
        val_payload = {"serialInput": sn, "answer": cap_val, "captchaType": "image"}
        r_val = s.post(f"https://checkcoverage.apple.com/api/v1/captchaValidate?locale={loc}", json=val_payload, verify=False, timeout=15)
        
        if r_val.ok and r_val.json().get('meta', {}).get('status') == 'SUCCESS':
            s.headers.pop("Content-Type", None)
            s.headers.pop("X-Apple-Csrf-Token", None)
            s.headers.pop("Accept", None)
            s.headers.update({
                "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8",
                "Sec-Fetch-Dest": "document",
                "Sec-Fetch-Mode": "navigate",
                "Sec-Fetch-Site": "same-origin",
                "Sec-Fetch-User": "?1",
                "Upgrade-Insecure-Requests": "1"
            })
            r_cov = s.get(f"https://checkcoverage.apple.com/coverage?locale={loc}", verify=False, timeout=15)
            if r_cov.ok:
                parsed_data = parse_apple_coverage(r_cov.text)
                if parsed_data and parsed_data['is_valid']:
                    return {
                        'code': 1,
                        'data': {
                            'goods_name': parsed_data['goods_name'],
                            'model': parsed_data['goods_name'],
                            'dop': parsed_data['dop'],
                            'expiry': parsed_data['expiry'],
                            'coverage_status': parsed_data['coverage_status'],
                            'open_repair': parsed_data['open_repair']
                        },
                        'raw': r_cov.text
                    }
    except Exception as e:
        return {'code': -1, 'raw': str(e)}
        
    return {'code': 0, 'raw': 'Validation Failed'}