import os
import requests
from bs4 import BeautifulSoup
from urllib.parse import urljoin

def telecharger_images(url, dossier_sortie="images"):
    # Créer le dossier de sortie s'il n'existe pas
    if not os.path.exists(dossier_sortie):
        os.makedirs(dossier_sortie)

    # Récupérer le contenu de la page web
    reponse = requests.get(url)
    if reponse.status_code != 200:
        print(f"Erreur : Impossible de récupérer la page {url}")
        return

    # Analyser le contenu HTML
    soup = BeautifulSoup(reponse.content, 'html.parser')
    images = soup.find_all('img')

    # Télécharger chaque image
    for i, image in enumerate(images):
        src = image.get('src')
        if not src:
            continue

        # Construire l'URL absolue de l'image
        url_image = urljoin(url, src)

        try:
            # Télécharger l'image
            reponse_image = requests.get(url_image, stream=True)
            if reponse_image.status_code == 200:
                # Deviner le nom de fichier
                nom_base = None
                extension = ".jpg"

                # 1. Essayer d'extraire le nom depuis l'URL
                chemin_url = src.split('?')[0]  # Retirer les paramètres de requête
                nom_url = os.path.basename(chemin_url)
                if nom_url and '.' in nom_url:
                    nom_base, extension = os.path.splitext(nom_url)

                # 2. Essayer l'attribut alt
                if not nom_base or nom_base.startswith('image_'):
                    alt = image.get('alt', '').strip()
                    if alt:
                        # Nettoyer le texte alt pour en faire un nom de fichier valide
                        nom_base = "".join(c for c in alt if c.isalnum() or c in (' ', '-', '_')).strip()
                        nom_base = nom_base.replace(' ', '_')

                # 3. Essayer l'attribut title
                if not nom_base or nom_base.startswith('image_'):
                    title = image.get('title', '').strip()
                    if title:
                        nom_base = "".join(c for c in title if c.isalnum() or c in (' ', '-', '_')).strip()
                        nom_base = nom_base.replace(' ', '_')

                # 4. Fallback sur un nom générique
                if not nom_base:
                    nom_base = f"image_{i}"

                # Limiter la longueur du nom
                nom_base = nom_base[:100]
                nom_fichier = os.path.join(dossier_sortie, f"{nom_base}{extension}")

                # Gérer les doublons
                compteur = 1
                nom_fichier_original = nom_fichier
                while os.path.exists(nom_fichier):
                    nom_fichier = os.path.join(dossier_sortie, f"{nom_base}_{compteur}{extension}")
                    compteur += 1

                # Sauvegarder l'image
                with open(nom_fichier, 'wb') as fichier:
                    for chunk in reponse_image.iter_content(1024):
                        fichier.write(chunk)
                print(f"Image téléchargée : {nom_fichier}")
            else:
                print(f"Erreur : Impossible de télécharger {url_image}")
        except Exception as e:
            print(f"Erreur lors du téléchargement de {url_image} : {e}")

# Exemple d'utilisation
url = "https://www.7tarot.fr/carte/arcanes-mineurs.htm"
telecharger_images(url)
