#!/usr/bin/env python3
"""YouTube video fetch and search."""
import sys
import json
import urllib.request
import urllib.error
import urllib.parse
import re

API_KEY = "YOUR_YOUTUBE_API_KEY"

def extract_video_id(url_or_id):
    patterns = [
        r'(?:v=|/v/|youtu\.be/)([a-zA-Z0-9_-]{11})',
        r'^([a-zA-Z0-9_-]{11})$',
    ]
    for p in patterns:
        m = re.search(p, url_or_id)
        if m:
            return m.group(1)
    return url_or_id

def search_videos(query, max_results=3):
    params = urllib.parse.urlencode({
        "q": query,
        "part": "snippet",
        "type": "video",
        "maxResults": max_results,
        "order": "relevance",
        "relevanceLanguage": "en",
        "regionCode": "GB",
        "key": API_KEY,
    })
    url = f"https://www.googleapis.com/youtube/v3/search?{params}"
    try:
        resp = urllib.request.urlopen(url, timeout=15)
        data = json.loads(resp.read().decode())
        results = []
        for item in data.get("items", []):
            vid = item["id"]["videoId"]
            snippet = item["snippet"]
            results.append({
                "video_id": vid,
                "url": f"https://www.youtube.com/watch?v={vid}",
                "title": snippet["title"],
                "channel": snippet["channelTitle"],
                "published": snippet["publishedAt"],
                "description": snippet["description"][:500],
            })
        return results
    except Exception as e:
        print(f"Search error: {e}")
        return []

def get_video_info(video_id):
    url = f"https://www.googleapis.com/youtube/v3/videos?id={video_id}&part=snippet,statistics,contentDetails&key={API_KEY}"
    try:
        resp = urllib.request.urlopen(url, timeout=15)
        data = json.loads(resp.read().decode())
        if data.get("items"):
            item = data["items"][0]
            snippet = item["snippet"]
            stats = item.get("statistics", {})
            return {
                "title": snippet["title"],
                "channel": snippet["channelTitle"],
                "description": snippet["description"][:2000],
                "published": snippet["publishedAt"],
                "views": stats.get("viewCount", "N/A"),
                "likes": stats.get("likeCount", "N/A"),
                "duration": item.get("contentDetails", {}).get("duration", "N/A"),
            }
    except Exception as e:
        return {"error": str(e)}
    return {"error": "Video not found"}

def main():
    if len(sys.argv) < 2:
        print("Usage:")
        print("  youtube_fetch.py <video_url>          — fetch video details")
        print("  youtube_fetch.py --search <query>     — search for videos")
        sys.exit(1)

    if sys.argv[1] == "--search":
        query = " ".join(sys.argv[2:])
        print(f"Searching YouTube for: {query}\n")
        results = search_videos(query)
        if not results:
            print("No results found.")
            return
        for i, r in enumerate(results, 1):
            print(f"--- Video {i} ---")
            print(f"URL: {r['url']}")
            print(f"Title: {r['title']}")
            print(f"Channel: {r['channel']}")
            print(f"Published: {r['published']}")
            print(f"Description: {r['description'][:300]}")
            print()
    else:
        video_id = extract_video_id(sys.argv[1])
        info = get_video_info(video_id)
        if "error" in info:
            print(f"Error: {info['error']}")
            sys.exit(1)
        print(f"Title: {info['title']}")
        print(f"Channel: {info['channel']}")
        print(f"Published: {info['published']}")
        print(f"Views: {info['views']}")
        print(f"Likes: {info['likes']}")
        print(f"Duration: {info['duration']}")
        print(f"\nDescription:\n{info['description'][:500]}")

if __name__ == "__main__":
    main()
