#!/usr/bin/env python

import sys
import subprocess
import time
import random


def ensure_package(pkg):
    try:
        __import__(pkg)
    except ImportError:
        subprocess.check_call([sys.executable, "-m", "pip", "install", pkg])


ensure_package("requests")

import requests
import argparse


def create_session():
    session = requests.Session()
    session.headers.update({
        "User-Agent": "Mozilla/5.0"
    })
    return session


def fetch(session, url, params=None, retries=2, timeout=5):
    for _ in range(retries):
        try:
            r = session.get(url, params=params, timeout=timeout)
            if r.status_code == 200:
                return r.json()
            time.sleep(random.uniform(1, 2))
        except requests.RequestException:
            time.sleep(random.uniform(1, 2))
    return None


def recherche_qwant(session, query, n):
    url = "https://api.qwant.com/v3/search/web"
    params = {
        "q": query,
        "count": n,
        "offset": 0,
        "t": "web",
        "safesearch": 0,
        "locale": "en_US"
    }

    data = fetch(session, url, params=params)
    if not data:
        return []

    results = []
    items = data.get("data", {}).get("result", {}).get("items", [])

    for item in items[:n]:
        title = item.get("title")
        link = item.get("url")
        if title and link:
            results.append((title, link))

    time.sleep(random.uniform(1, 2))
    return results


def extract_text(session, url, max_chars):
    try:
        r = session.get(url, timeout=5)
        text = r.text
        return (text[:max_chars] + "...") if len(text) > max_chars else text
    except Exception as e:
        return f"[Erreur: {e}]"


def main(argc, argv):
    parser = argparse.ArgumentParser()
    parser.add_argument("query", type=str)
    parser.add_argument("-n", "--number", type=int, default=5)
    parser.add_argument("--chars", type=int, default=1000)

    args = parser.parse_args(argv[1:])

    session = create_session()
    results = recherche_qwant(session, args.query, args.number)

    for i, (title, link) in enumerate(results, 1):
        print(f"\n{i}. {title}")
        print(f"URL: {link}")
        snippet = extract_text(session, link, args.chars)
        print(f"Extrait: {snippet}")


if __name__ == "__main__":
    main(len(sys.argv), sys.argv)
