#!/usr/bin/env python3
# -*- coding: utf-8 -*-

"""
Script pour extraire toutes les images d'un ticket Odoo.
Ce script combine l'extracteur d'images standard et l'extracteur d'images HTML.
"""

import os
import sys
import json
import argparse
import logging
from typing import Dict, List, Any, Optional

# Importer les extracteurs
from .html_image_extractor import extract_images_from_ticket
from .extract_all_images import enhance_ticket_data_with_images

def setup_logging(verbose: bool = False) -> None:
    """
    Configure la journalisation.
    
    Args:
        verbose: Mode verbeux pour plus de détails
    """
    level = logging.DEBUG if verbose else logging.INFO
    logging.basicConfig(
        level=level,
        format='%(asctime)s - %(name)s - %(levelname)s - %(message)s',
        datefmt='%Y-%m-%d %H:%M:%S'
    )

def extract_ticket_images(ticket_dir: str, output_file: Optional[str] = None, verbose: bool = False) -> Dict[str, Any]:
    """
    Extrait toutes les images d'un ticket Odoo.
    
    Args:
        ticket_dir: Répertoire du ticket
        output_file: Fichier de sortie pour les résultats (optionnel)
        verbose: Mode verbeux pour plus de détails
        
    Returns:
        Dictionnaire avec les résultats de l'extraction
    """
    setup_logging(verbose)
    
    if not os.path.exists(ticket_dir):
        logging.error(f"Répertoire introuvable: {ticket_dir}")
        return {"status": "error", "message": "Répertoire introuvable"}
    
    logging.info(f"Analyse des images pour le ticket dans: {ticket_dir}")
    
    # Charger les données du ticket
    ticket_summary_path = os.path.join(ticket_dir, "ticket_summary.json")
    attachments_info_path = os.path.join(ticket_dir, "attachments_info.json")
    
    ticket_data = {"ticket_dir": ticket_dir}
    
    # Charger les données du ticket si disponibles
    if os.path.exists(ticket_summary_path):
        try:
            with open(ticket_summary_path, 'r', encoding='utf-8') as f:
                ticket_data["ticket_summary"] = json.load(f)
                logging.info("Données du ticket chargées")
        except Exception as e:
            logging.error(f"Erreur lors du chargement des données du ticket: {e}")
    
    # Charger les pièces jointes si disponibles
    if os.path.exists(attachments_info_path):
        try:
            with open(attachments_info_path, 'r', encoding='utf-8') as f:
                ticket_data["attachments"] = json.load(f)
                logging.info(f"Pièces jointes chargées: {len(ticket_data['attachments'])}")
        except Exception as e:
            logging.error(f"Erreur lors du chargement des pièces jointes: {e}")
    
    # Enrichir les données avec toutes les images
    try:
        enhanced_data = enhance_ticket_data_with_images(ticket_data)
        logging.info(f"Images identifiées: {enhanced_data.get('images_count', 0)}")
        
        # Préparer les résultats
        result = {
            "status": "success",
            "ticket_dir": ticket_dir,
            "images": enhanced_data.get("images", []),
            "standard_images": enhanced_data.get("standard_images", []),
            "embedded_images": enhanced_data.get("embedded_images", []),
            "stats": enhanced_data.get("images_stats", {})
        }
        
        # Ajouter les informations du ticket si disponibles
        if "ticket_summary" in enhanced_data:
            ticket_summary = enhanced_data["ticket_summary"]
            result["ticket_code"] = ticket_summary.get("code", "")
            result["ticket_name"] = ticket_summary.get("name", "")
        
        # Sauvegarder les résultats si un fichier de sortie est spécifié
        if output_file:
            output_dir = os.path.dirname(output_file)
            if output_dir and not os.path.exists(output_dir):
                os.makedirs(output_dir, exist_ok=True)
                
            with open(output_file, 'w', encoding='utf-8') as f:
                json.dump(result, f, indent=2, ensure_ascii=False)
            logging.info(f"Résultats sauvegardés dans: {output_file}")
        else:
            # Utiliser un fichier de sortie par défaut dans le répertoire du ticket
            default_output = os.path.join(ticket_dir, "all_images.json")
            with open(default_output, 'w', encoding='utf-8') as f:
                json.dump(result, f, indent=2, ensure_ascii=False)
            logging.info(f"Résultats sauvegardés dans: {default_output}")
        
        return result
        
    except Exception as e:
        logging.exception(f"Erreur lors de l'extraction des images: {e}")
        return {"status": "error", "message": str(e)}

def parse_arguments():
    """
    Parse les arguments de la ligne de commande.
    
    Returns:
        Arguments parsés
    """
    parser = argparse.ArgumentParser(description="Extrait toutes les images d'un ticket Odoo.")
    parser.add_argument("ticket_dir", help="Répertoire du ticket")
    parser.add_argument("--output", "-o", help="Fichier de sortie pour les résultats")
    parser.add_argument("--verbose", "-v", action="store_true", help="Mode verbeux pour plus de détails")
    return parser.parse_args()

def main():
    """
    Point d'entrée principal.
    """
    args = parse_arguments()
    
    result = extract_ticket_images(
        ticket_dir=args.ticket_dir,
        output_file=args.output,
        verbose=args.verbose
    )
    
    # Afficher un résumé des résultats
    if result["status"] == "success":
        stats = result.get("stats", {})
        print("\nStatistiques des images:")
        print(f"  Total: {stats.get('total', 0)}")
        print(f"  Standard: {stats.get('standard', 0)}")
        print(f"  Intégrées: {stats.get('embedded', 0)}")
        
        # Afficher les chemins des images
        if args.verbose:
            print("\nImages standard:")
            for img in result.get("standard_images", []):
                print(f"  {img}")
            
            print("\nImages intégrées dans le HTML:")
            for img in result.get("embedded_images", []):
                print(f"  {img}")
    else:
        print(f"Erreur: {result.get('message', 'Erreur inconnue')}")
        sys.exit(1)

if __name__ == "__main__":
    main() 