import requests
from bs4 import BeautifulSoup
import csv
import time

# URL de base
base_url = "https://daspower.fr/?Tarifs"

# Initialisation du compteur ID
id_counter = 1

# Ouvrir le fichier CSV pour écrire les données
with open("marques_et_modeles_complets.csv", mode="w", newline='', encoding='utf-8-sig') as f:
    writer = csv.writer(f, delimiter=';')
    writer.writerow([
        "ID", "Marque", "Modèle", "Génération", "Type Carburant", "Motorisation",
        "Puissance Origine", "Couple Origine", "Stage", "Gain Puissance", 
        "Résultat Puissance", "Gain Couple", "Résultat Couple", "Prix"
    ])

    # Récupérer le contenu de la page principale
    print("Fetching base URL:", base_url)
    response = requests.get(base_url)
    soup = BeautifulSoup(response.text, 'html.parser')

    # Trouver tous les liens de marque avec la classe "logoMarque"
    marques = soup.find_all("a", class_="logoMarque")
    if not marques:
        print("No marques found.")
    
    for marque in marques:
        marque_name = marque.find("img")['alt'] if marque.find("img") else 'Nom inconnu'
        marque_url = base_url.split('?')[0] + marque['href']
        print(f"Processing marque: {marque_name}, URL: {marque_url}")
        
        response_marque = requests.get(marque_url)
        soup_marque = BeautifulSoup(response_marque.text, 'html.parser')

        # Trouver les modèles
        modele_container = soup_marque.find("div", class_="modeleContainer")
        if not modele_container:
            print(f"No models found for marque {marque_name}")
            continue
        modeles = modele_container.find_all("a", class_="selectCar")

        for modele in modeles:
            modele_name = modele.get_text(strip=True)
            modele_url = base_url.split('?')[0] + modele['href']
            print(f"  Processing model: {modele_name}, URL: {modele_url}")

            response_modele = requests.get(modele_url)
            soup_modele = BeautifulSoup(response_modele.text, 'html.parser')

            # Trouver les générations
            generation_container = soup_modele.find("div", class_="carList")
            if not generation_container:
                print(f"    No generations found for model {modele_name}")
                continue
            generations = generation_container.find_all("a", class_="selectGen")

            for generation in generations:
                generation_name = generation.get_text(strip=True)
                generation_url = base_url.split('?')[0] + generation['href']
                print(f"    Processing generation: {generation_name}, URL: {generation_url}")

                response_generation = requests.get(generation_url)
                soup_generation = BeautifulSoup(response_generation.text, 'html.parser')

                # Trouver tous les types de carburant et motorisations
                motorisation_containers = soup_generation.find_all("div", class_="carList2")
                if not motorisation_containers:
                    print(f"    No motorisations found for generation {generation_name}")
                    continue
                
                for motorisation_container in motorisation_containers:
                    carburant_type = motorisation_container.find("h4").get_text(strip=True)
                    motorisations = motorisation_container.find_all("a", class_="selectGen")

                    for motorisation in motorisations:
                        motorisation_name = motorisation.get_text(" ", strip=True)
                        motorisation_url = base_url.split('?')[0] + motorisation['href']
                        print(f"      Processing motorisation: {motorisation_name}, Type: {carburant_type}, URL: {motorisation_url}")

                        # Charger la page de la motorisation pour extraire les stages
                        response_motorisation = requests.get(motorisation_url)
                        soup_motorisation = BeautifulSoup(response_motorisation.text, 'html.parser')
                        
                        # Vérifier et extraire les stages multiples
                        stage_container = soup_motorisation.find("div", class_="resultTabs")
                        if not stage_container:
                            print(f"      No stages found for motorisation {motorisation_name}")
                            continue
                        stage_names = stage_container.find_all("h3", class_="resultStage")
                        stages = stage_container.find_all("table", class_="resultTab")
                        
                        for idx, stage in enumerate(stages):
                            stage_name = stage_names[idx].get_text(strip=True) if idx < len(stage_names) else "Stage inconnu"
                            print(f"        Processing stage: {stage_name}")
                            
                            try:
                                rows = stage.find_all("tr")
                                puissance_origine = rows[1].find_all("td")[1].get_text(strip=True)
                                gain_puissance = rows[1].find_all("td")[2].get_text(strip=True)
                                puissance_resultat = rows[1].find_all("td")[3].get_text(strip=True)
                                
                                couple_origine = rows[2].find_all("td")[1].get_text(strip=True)
                                gain_couple = rows[2].find_all("td")[2].get_text(strip=True)
                                couple_resultat = rows[2].find_all("td")[3].get_text(strip=True)
                                
                                prix = stage.find("td", string="Prix TTC (€)").find_next("td").get_text(strip=True)
                            except (AttributeError, IndexError):
                                puissance_origine = gain_puissance = puissance_resultat = "N/A"
                                couple_origine = gain_couple = couple_resultat = "N/A"
                                prix = "N/A"
                            
                            # Écrire toutes les informations dans le CSV avec l'ID unique
                            writer.writerow([
                                id_counter, marque_name, modele_name, generation_name, carburant_type,
                                motorisation_name, puissance_origine, couple_origine, stage_name,
                                gain_puissance, puissance_resultat, gain_couple, couple_resultat, prix
                            ])
                            id_counter += 1  # Incrémentation de l'ID
                time.sleep(1)
