import csv, os, requests, json


def map_csv_file(file_path, mapping, encoding="utf-8", delimiter=";"):
    mapped_data = []
    with open(file_path, 'r', encoding=encoding) as f:
        reader = csv.DictReader(f, delimiter=delimiter)
        for row in reader:
            mapped_row = {}
            for csv_field, internal_field in mapping.items():
                # On prend la valeur du champ CSV et on la place dans la clé interne
                mapped_row[internal_field] = row.get(csv_field)
            mapped_data.append(mapped_row)
    return mapped_data

def extract_company_id(tags):
    if isinstance(tags, str):
        tags = [tag.strip() for tag in tags.split(",")]
    for tag in tags:
        if tag.startswith("Company Id:"):
            numeric_part = tag.split(":", 1)[1].strip()
            return {"full_tag": tag, "id": numeric_part}
    return None

def find_product_by_id(all_products, product_tag_id):
    for product in all_products:
        tags = product.get("tags", "")
        if isinstance(tags, str):
            tags_list = tags.split(',')
        else:
            tags_list = []
        for tag in tags_list:
            tag = tag.strip()
            if tag == product_tag_id:
                return product
    return None

def extract_data_by_label(label, value, data):
    for item in data:
        if item.get(label) == value:
            return item
    return None

def get_variant_by_id (all_variants, variant_tag_id):
    for variant in all_variants:
        tags = variant.get("tags", "")
        if isinstance(tags, str):
            tags_list = tags.split(',')
        else:
            tags_list = []
        for tag in tags_list:
            tag = tag.strip()
            if tag == variant_tag_id:
                return variant
    return None


def extract_datas_by_label(label, value, data):
    items_to_return = []
    for item in data:
        if item.get(label) == value:
            items_to_return.append(item)
    return items_to_return if items_to_return else None


def download_image(url, download_dir="images"):
    if not url:
        return None

    # Vérifier si l'URL correspond à un lien sans image (se termine par "pdi_")
    if url.rstrip().endswith("pdi_"):
        return None

    try:
        response = requests.get(url, stream=True, timeout=10)
        response.raise_for_status()  # Vérifie que la réponse est 200 OK

        # Extraire le nom du fichier depuis l'URL (en retirant les éventuels paramètres)
        filename = os.path.basename(url.split('?')[0])
        name, ext = os.path.splitext(filename)
        # Ajouter l'extension .jpg si elle est absente
        if not ext:
            ext = '.jpg'
            filename = name + ext

        # Créer le répertoire de téléchargement s'il n'existe pas
        if not os.path.exists(download_dir):
            os.makedirs(download_dir)

        filepath = os.path.join(download_dir, filename)

        with open(filepath, 'wb') as f:
            for chunk in response.iter_content(chunk_size=1024):
                if chunk:
                    f.write(chunk)

        return filename
    except Exception as e:
        return None
def find_rule_by_name(name, all_cp_rules):
    for rule in all_cp_rules:
        if rule["name"] == name:
            return rule
    return None

def not_import_client_csv(non_imported_clients: list, source_filename: str, output_filepath: str = None):
    if output_filepath is None:
        base, ext = os.path.splitext(source_filename)
        output_filepath = f"{base}_non_importes.csv"
    
    header = ["CLIENT NON IMPORTÉ", "RAISON"]
    reason = f"PAS DE MAIL DANS LE CSV ({source_filename})"
    
    with open(output_filepath, mode="w", newline="", encoding="utf-8") as csvfile:
        writer = csv.writer(csvfile)
        writer.writerow(header)
        for client in non_imported_clients:
            client_str = json.dumps(client, ensure_ascii=False)
            writer.writerow([client_str, reason])
    
    print(f"Fichier CSV généré : {output_filepath}")


def download_sftp_file(SFTP_USERNAME,SFTP_PASSWORD,SFTP_PORT,SFTP_HOST,remote_folder: str, file_name: str, local_folder: str) -> str:
    local_path = os.path.join(local_folder, file_name)
    transport = paramiko.Transport((SFTP_HOST, SFTP_PORT))
    try:
        transport.connect(username=SFTP_USERNAME, password=SFTP_PASSWORD)
        sftp = paramiko.SFTPClient.from_transport(transport)
        remote_path = os.path.join(remote_folder, file_name)
        sftp.get(remote_path, local_path)
        print(f"Téléchargement de {remote_path} réussi dans {local_path}")
    finally:
        sftp.close()
        transport.close()
    return local_path