"""
Proxy Configuration for Web Scraping
Contains datacenter and residential proxy settings.

Usage:
    from proxy_config import get_proxy, get_headers, make_request

    # Use default (datacenter) proxy
    response = make_request('https://example.com')

    # Use residential proxy for stricter sites
    response = make_request('https://draftkings.com', proxy_type='residential')
"""
import requests
import random
import time

# Proxy configurations
PROXIES = {
    'datacenter': {
        'http': 'socks5h://goDRdyJf:1aIFz9LNOW@82.163.172.166:50101',
        'https': 'socks5h://goDRdyJf:1aIFz9LNOW@82.163.172.166:50101'
    },
    'residential': {
        'http': 'socks5h://54.38.19.233:3028',
        'https': 'socks5h://54.38.19.233:3028'
    },
    'mobile': {
        'http': 'socks5h://rcg8xifhpi-mobile.res-country-US-state-4138106-city-4140963-hold-session-session-696f0b419355b:BiTdz79dSml10jvQ@93.190.141.105:443',
        'https': 'socks5h://rcg8xifhpi-mobile.res-country-US-state-4138106-city-4140963-hold-session-session-696f0b419355b:BiTdz79dSml10jvQ@93.190.141.105:443'
    },
    'none': None,
}

# Playwright-compatible proxy configs (no auth for residential, auth for mobile)
PLAYWRIGHT_PROXIES = {
    'residential': {'server': 'socks5://54.38.19.233:3028'},
    'mobile': {
        'server': 'socks5://93.190.141.105:443',
        'username': 'rcg8xifhpi-mobile.res-country-US-state-4138106-city-4140963-hold-session-session-696f0b419355b',
        'password': 'BiTdz79dSml10jvQ'
    },
}

def get_rotating_proxy():
    """Get a random proxy for rotation"""
    choices = ['residential', 'mobile', 'datacenter']
    return random.choice(choices)

# User agent rotation
USER_AGENTS = [
    'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36',
    'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36',
    'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:122.0) Gecko/20100101 Firefox/122.0',
    'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/17.2 Safari/605.1.15',
]


def get_proxy(proxy_type='datacenter'):
    """Get proxy configuration by type"""
    return PROXIES.get(proxy_type, PROXIES['datacenter'])


def get_headers(custom_headers=None):
    """Get request headers with random user agent"""
    headers = {
        'User-Agent': random.choice(USER_AGENTS),
        'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
        'Accept-Language': 'en-US,en;q=0.5',
        'Accept-Encoding': 'gzip, deflate',
        'Connection': 'keep-alive',
    }
    if custom_headers:
        headers.update(custom_headers)
    return headers


def make_request(url, proxy_type='datacenter', method='GET', timeout=30, 
                retry_with_residential=True, delay_range=(1, 3), **kwargs):
    """
    Make HTTP request with proxy and retry logic.
    
    Args:
        url: Target URL
        proxy_type: 'datacenter', 'residential', or 'none'
        method: HTTP method
        timeout: Request timeout in seconds
        retry_with_residential: If datacenter fails, retry with residential
        delay_range: Random delay range in seconds (min, max)
        **kwargs: Additional requests parameters
    
    Returns:
        requests.Response or None on failure
    """
    # Add random delay
    if delay_range:
        time.sleep(random.uniform(*delay_range))
    
    proxy = get_proxy(proxy_type)
    headers = get_headers(kwargs.pop('headers', None))
    
    try:
        response = requests.request(
            method=method,
            url=url,
            proxies=proxy,
            headers=headers,
            timeout=timeout,
            **kwargs
        )
        return response
    except Exception as e:
        print(f"Request failed ({proxy_type}): {e}")
        
        # Retry with residential if datacenter failed
        if retry_with_residential and proxy_type == 'datacenter':
            print("  Retrying with residential proxy...")
            time.sleep(2)
            try:
                response = requests.request(
                    method=method,
                    url=url,
                    proxies=get_proxy('residential'),
                    headers=headers,
                    timeout=timeout,
                    **kwargs
                )
                return response
            except Exception as e2:
                print(f"  Residential also failed: {e2}")
        
        return None


# Site-specific proxy recommendations
SITE_PROXY_MAP = {
    'draftkings.com': 'residential',
    'fanduel.com': 'residential',
    'actionnetwork.com': 'residential',  # Uses anti-bot, datacenter often blocked
    'oddsportal.com': 'datacenter',
    'covers.com': 'datacenter',
    'espn.com': 'none',
}


def get_recommended_proxy(url):
    """Get recommended proxy type for a URL"""
    for site, proxy_type in SITE_PROXY_MAP.items():
        if site in url.lower():
            return proxy_type
    return 'datacenter'
