import requests
from bs4 import BeautifulSoup
from urllib.parse import urljoin
import csv
import time

BASE_URL = "https://www.br-performance.fr/brp-paris/reprogrammation/1-voitures/"

def fetch_page(url):
    try:
        response = requests.get(url)
        response.raise_for_status()
        return BeautifulSoup(response.text, "html.parser")
    except requests.exceptions.RequestException as e:
        print(f"Erreur lors de la connexion à {url}: {e}")
        return None

def get_full_url(href):
    # Assure que BASE_URL est ajouté seulement si href est un chemin relatif
    if href.startswith("http"):
        return href  # URL complète
    else:
        return urljoin(BASE_URL, href.lstrip('/'))  # Joint BASE_URL avec chemin relatif

def scrape_marques():
    soup = fetch_page(BASE_URL)
    if soup:
        marques = []
        for marque in soup.select("#brands a.merk"):
            name = marque.img["alt"]
            href = marque["href"]
            url = get_full_url(href)
            marques.append((name, url))
        print(f"Found {len(marques)} marques")
        return marques
    return []

def scrape_modeles(marque_name, marque_url):
    soup = fetch_page(marque_url)
    if soup:
        modeles = []
        for modele in soup.select("a.model-class"):
            name = modele.text.strip()
            href = modele["href"]
            url = get_full_url(href)
            modeles.append((name, url))
        print(f"Found {len(modeles)} modeles for {marque_name}")
        return modeles
    return []

def scrape_annees(modele_name, modele_url):
    soup = fetch_page(modele_url)
    if soup:
        annees = []
        for annee in soup.select("a.year-class"):
            name = annee.text.strip()
            href = annee["href"]
            url = get_full_url(href)
            annees.append((name, url))
        print(f"Found {len(annees)} années for {modele_name}")
        return annees
    return []

def scrape_moteurs(annee_name, annee_url):
    soup = fetch_page(annee_url)
    if soup:
        moteurs = []
        for moteur in soup.select("a.engine-link"):
            name = moteur.text.strip()
            href = moteur["href"]
            url = get_full_url(href)
            moteurs.append((name, url))
        print(f"Found {len(moteurs)} moteurs for {annee_name}")
        return moteurs
    return []

def scrape_specifications(marque, modele, annee, moteur, moteur_url):
    soup = fetch_page(moteur_url)
    if soup:
        specs = {"marque": marque, "modele": modele, "annee": annee, "moteur": moteur}
        table = soup.select_one("table.specs")
        if table:
            rows = table.select("tr")
            for row in rows:
                cols = row.select("td")
                if len(cols) == 2:
                    key, value = cols[0].text.strip(), cols[1].text.strip()
                    specs[key] = value
        return specs
    return None

def main():
    all_specs = []
    marques = scrape_marques()
    for marque_name, marque_url in marques:
        print(f"Traitement de la marque : {marque_name} - URL : {marque_url}")
        modeles = scrape_modeles(marque_name, marque_url)
        for modele_name, modele_url in modeles:
            print(f"  Traitement du modèle : {modele_name} - URL : {modele_url}")
            annees = scrape_annees(modele_name, modele_url)
            for annee_name, annee_url in annees:
                print(f"    Traitement de l'année : {annee_name} - URL : {annee_url}")
                moteurs = scrape_moteurs(annee_name, annee_url)
                for moteur_name, moteur_url in moteurs:
                    print(f"      Traitement du moteur : {moteur_name} - URL : {moteur_url}")
                    specs = scrape_specifications(marque_name, modele_name, annee_name, moteur_name, moteur_url)
                    if specs:
                        all_specs.append(specs)
                    time.sleep(1)  # Pause pour éviter de surcharger le serveur

    with open("specifications.csv", mode="w", newline="") as file:
        writer = csv.DictWriter(file, fieldnames=["marque", "modele", "annee", "moteur", "puissance_origine", "puissance_modifiee", "couple_origine", "couple_modifie"])
        writer.writeheader()
        writer.writerows(all_specs)

    print("Données enregistrées dans specifications.csv")

if __name__ == "__main__":
    main()
