#!/usr/bin/env python3
"""
Script to refresh Discord CDN URLs with fresh authentication parameters.
Discord media.discordapp.net URLs require query parameters that expire.
This script fetches each image to get the fresh redirect URL.
"""

import re
import urllib.request
from urllib.parse import urlparse, parse_qs
from urllib.error import URLError, HTTPError

def get_fresh_discord_url(old_url):
    """
    Fetch a Discord CDN URL and get the fresh redirect URL with valid parameters.

    Args:
        old_url: Discord URL without parameters or with expired parameters

    Returns:
        Fresh URL with valid parameters, or None if fetch fails
    """
    # Clean URL - remove any existing parameters
    base_url = old_url.split('?')[0]

    # Try to fetch the URL and get redirect
    try:
        request = urllib.request.Request(base_url, method='HEAD')
        request.add_header('User-Agent', 'Mozilla/5.0')

        with urllib.request.urlopen(request, timeout=10) as response:
            # The final URL after redirects should have fresh parameters
            return response.url
    except HTTPError as e:
        print(f"  ⚠️  HTTP {e.code} for: {base_url}")
        return None
    except Exception as e:
        print(f"  ❌ Error fetching {base_url}: {e}")
        return None

def update_functions_file():
    """
    Update all Discord CDN URLs in functions.py with fresh parameters.
    """
    print("🔄 Starting Discord URL refresh process...\n")

    # Read the file
    with open('functions.py', 'r') as f:
        content = f.read()

    # Find all Discord URLs (with or without parameters)
    pattern = r'https://media\.discordapp\.net/[^"\'\)]+?\.png[^"\'\)]*'
    matches = re.finditer(pattern, content)

    # Extract unique URLs
    urls_to_update = {}
    for match in matches:
        old_url = match.group(0)
        base_url = old_url.split('?')[0]
        if base_url not in urls_to_update:
            urls_to_update[base_url] = old_url

    print(f"Found {len(urls_to_update)} unique Discord image URLs to refresh\n")

    # Fetch fresh URLs
    fresh_urls = {}
    for i, (base_url, old_url) in enumerate(urls_to_update.items(), 1):
        print(f"[{i}/{len(urls_to_update)}] Fetching fresh URL...")
        fresh_url = get_fresh_discord_url(base_url)
        if fresh_url:
            fresh_urls[old_url] = fresh_url
            print(f"  ✓ Success")
        else:
            print(f"  ⚠️  Keeping old URL")
            fresh_urls[old_url] = old_url

    print(f"\n✓ Successfully refreshed {len([u for u in fresh_urls.values() if '?' in u])} URLs")

    # Update content
    updated_content = content
    for old_url, fresh_url in fresh_urls.items():
        updated_content = updated_content.replace(old_url, fresh_url)

    # Write back to file
    with open('functions.py', 'w') as f:
        f.write(updated_content)

    print("✓ Updated functions.py with fresh URLs\n")

if __name__ == "__main__":
    update_functions_file()
