import requests
from bs4 import BeautifulSoup
import json
import re
import time

def scrape_amazon_watch_bands():
    headers = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36',
        'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8',
        'Accept-Language': 'en-US,en;q=0.9',
        'Accept-Encoding': 'gzip, deflate, br',
        'Connection': 'keep-alive',
        'Upgrade-Insecure-Requests': '1'
    }
    
    url = 'https://www.amazon.com/s?k=apple+watch+band&s=exact-aware-popularity-rank'
    
    try:
        response = requests.get(url, headers=headers, timeout=30)
        response.raise_for_status()
        soup = BeautifulSoup(response.text, 'html.parser')
        
        products = []
        items = soup.find_all('div', {'data-component-type': 's-search-result'})
        
        for idx, item in enumerate(items[:20], 1):
            try:
                # Product name
                title_elem = item.find('h2', class_='s-line-clamp-2')
                if not title_elem:
                    continue
                name = title_elem.get_text(strip=True)
                
                # URL
                link_elem = item.find('a', class_='a-link-normal s-no-outline')
                if link_elem and link_elem.get('href'):
                    product_url = 'https://www.amazon.com' + link_elem['href']
                else:
                    product_url = ''
                
                # ASIN (from data-asin attribute)
                asin = item.get('data-asin', '')
                
                # Image
                img_elem = item.find('img', class_='s-image')
                image_url = img_elem.get('src', '') if img_elem else ''
                
                # Price
                price = ''
                price_elem = item.find('span', class_='a-price')
                if price_elem:
                    price_whole = price_elem.find('span', class_='a-price-whole')
                    price_fraction = price_elem.find('span', class_='a-price-fraction')
                    if price_whole:
                        price = f"${price_whole.get_text(strip=True).replace(',', '')}"
                        if price_fraction:
                            price = price.rstrip('.') + '.' + price_fraction.get_text(strip=True)
                
                # Rating
                rating = 0
                rating_elem = item.find('span', class_='a-icon-alt')
                if rating_elem:
                    rating_text = rating_elem.get_text(strip=True)
                    match = re.search(r'([\d.]+)\s*out of', rating_text)
                    if match:
                        rating = float(match.group(1))
                
                # Reviews count
                reviews = 0
                reviews_elem = item.find('span', class_='a-size-base s-underline-text')
                if reviews_elem:
                    reviews_text = reviews_elem.get_text(strip=True).replace(',', '')
                    match = re.search(r'(\d+)', reviews_text)
                    if match:
                        reviews = int(match.group(1))
                
                # Brand (try to extract from title)
                brand = name.split()[0] if name else 'Unknown'
                
                product = {
                    'rank': idx,
                    'name': name,
                    'brand': brand,
                    'image_url': image_url,
                    'price': price,
                    'rating': rating,
                    'reviews': reviews,
                    'url': product_url,
                    'asin': asin
                }
                
                products.append(product)
                print(f"✓ Scraped #{idx}: {name[:50]}...")
                
            except Exception as e:
                print(f"✗ Error parsing product #{idx}: {e}")
                continue
        
        return products
        
    except requests.exceptions.RequestException as e:
        print(f"✗ Request failed: {e}")
        return []

if __name__ == '__main__':
    print("Starting Amazon Apple Watch Bands scraper...")
    print("=" * 60)
    
    products = scrape_amazon_watch_bands()
    
    if products:
        output_file = 'products.json'
        with open(output_file, 'w', encoding='utf-8') as f:
            json.dump(products, f, indent=2, ensure_ascii=False)
        
        print("=" * 60)
        print(f"✓ Successfully scraped {len(products)} products")
        print(f"✓ Data saved to {output_file}")
        
        # Print summary
        print("\n--- Sample Data ---")
        for p in products[:3]:
            print(f"\n#{p['rank']}: {p['name'][:60]}")
            print(f"  Brand: {p['brand']}")
            print(f"  Price: {p['price']}")
            print(f"  Rating: {p['rating']} ({p['reviews']} reviews)")
    else:
        print("✗ No products scraped. Please check the URL or network.")
