#!/usr/bin/env python3
"""
Script principal pour récupérer un ticket depuis Odoo et extraire ses données.
Ce script fait appel aux utilitaires dans le package utils pour effectuer l'extraction.
"""

import os
import sys
import json
import argparse
from datetime import datetime
from odoo.auth_manager import AuthManager
from odoo.ticket_manager import TicketManager
from core.utils import setup_logging, log_separator
from formatters.json_to_markdown import create_markdown_from_json

# Importation de l'extracteur d'images HTML (optionnel)
try:
    from utils.image_extractor import extract_images_from_ticket
    from utils.image_extractor.extract_all_images import enhance_ticket_data_with_images
    HTML_IMAGE_EXTRACTOR_AVAILABLE = True
except ImportError:
    HTML_IMAGE_EXTRACTOR_AVAILABLE = False

def parse_arguments():
    """Parse les arguments de ligne de commande."""
    parser = argparse.ArgumentParser(description="Récupère un ticket Odoo par son code et extrait ses données.")
    parser.add_argument("ticket_code", help="Code du ticket à extraire")
    parser.add_argument("--output", "-o", help="Répertoire de sortie", default=None)
    parser.add_argument("--config", "-c", help="Fichier de configuration", default="config.json")
    parser.add_argument("--verbose", "-v", action="store_true", help="Mode verbeux")
    parser.add_argument("--no-md", action="store_true", help="Désactiver la génération automatique du fichier Markdown")
    parser.add_argument("--extract-html-images", action="store_true", help="Activer l'extraction des images intégrées dans le HTML")
    return parser.parse_args()

def load_config(config_file):
    """Charge le fichier de configuration."""
    try:
        with open(config_file, 'r') as f:
            return json.load(f)
    except Exception as e:
        print(f"Erreur lors du chargement du fichier de configuration: {e}")
        sys.exit(1)

def main():
    """Fonction principale du script."""
    args = parse_arguments()
    config = load_config(args.config)
    
    # Configurer la journalisation
    log_level = "DEBUG" if args.verbose else "INFO"
    setup_logging(log_level)
    
    # Extraire les informations de connexion
    odoo_config = config.get("odoo", {})
    url = odoo_config.get("url")
    db = odoo_config.get("db")
    username = odoo_config.get("username")
    api_key = odoo_config.get("api_key")
    
    if not all([url, db, username, api_key]):
        print("Informations de connexion Odoo manquantes dans le fichier de configuration")
        sys.exit(1)
    
    # Définir le répertoire de sortie
    output_dir = args.output or os.path.join(config.get("output_dir", "output"), f"ticket_{args.ticket_code}")
    
    # Créer le répertoire de sortie spécifique au ticket avec horodatage
    timestamp = datetime.now().strftime("%Y%m%d_%H%M%S")
    ticket_dir = os.path.join(output_dir, f"{args.ticket_code}_{timestamp}")
    os.makedirs(ticket_dir, exist_ok=True)
    
    print(f"Extraction du ticket {args.ticket_code}...")
    
    try:
        # Initialiser l'authentification
        auth_manager = AuthManager(
            url=url,
            db=db,
            username=username,
            api_key=api_key
        )
        
        if not auth_manager.login():
            print("Échec de l'authentification à Odoo")
            sys.exit(1)
        
        # Extraire les données du ticket
        ticket_manager = TicketManager(auth_manager)
        result = ticket_manager.extract_ticket_data(args.ticket_code, ticket_dir)
        
        if not result:
            print(f"Échec de l'extraction du ticket {args.ticket_code}")
            sys.exit(1)
        
        # Extraire les images intégrées dans le HTML si demandé
        html_images = []
        if args.extract_html_images and HTML_IMAGE_EXTRACTOR_AVAILABLE:
            print("Extraction des images intégrées dans le HTML...")
            html_images = extract_images_from_ticket(ticket_dir)
            
            if html_images:
                # Ajouter les images HTML au résultat
                result["html_images"] = html_images
                result["html_images_count"] = len(html_images)
                
                # Créer un fichier JSON avec toutes les images
                # Récupérer d'abord les images standard
                ticket_data = {
                    "ticket_dir": ticket_dir,
                    "attachments": result.get("attachments", [])
                }
                
                # Enrichir les données avec toutes les images
                enhanced_data = enhance_ticket_data_with_images(ticket_data)
                
                # Sauvegarder le résultat
                all_images_path = os.path.join(ticket_dir, "all_images.json")
                with open(all_images_path, 'w', encoding='utf-8') as f:
                    json.dump({
                        "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", {})
                    }, f, indent=2, ensure_ascii=False)
                
                print(f"Trouvé {len(html_images)} images intégrées dans le HTML")
        
        # Générer un rapport de fin
        summary = {
            "timestamp": timestamp,
            "ticket_code": args.ticket_code,
            "output_directory": ticket_dir,
            "message_count": result.get("messages_count", 0),
            "attachment_count": result.get("attachments_count", 0),
            "html_images_count": len(html_images) if HTML_IMAGE_EXTRACTOR_AVAILABLE and args.extract_html_images else 0,
            "files_created": [
                os.path.basename(result.get("ticket_info", "")),
                os.path.basename(result.get("ticket_summary", "")),
                os.path.basename(result.get("messages_file", "")),
                os.path.basename(result.get("ticket_data_file", ""))
            ]
        }
        
        # Générer automatiquement le fichier Markdown si demandé
        md_file_path = None
        if not args.no_md:
            json_file = result.get("messages_file", "")
            if json_file and os.path.exists(json_file):
                md_file_path = os.path.join(ticket_dir, "rapport.md")
                print(f"Génération du rapport Markdown...")
                if create_markdown_from_json(json_file, md_file_path):
                    print(f"Rapport Markdown créé: {md_file_path}")
                    summary["files_created"].append("rapport.md")
                else:
                    print("Échec de la génération du rapport Markdown")
        
        # Afficher le résumé
        print("\nExtraction terminée avec succès")
        print(f"Ticket: {args.ticket_code}")
        print(f"Répertoire: {ticket_dir}")
        print(f"Messages traités: {result.get('messages_count', 0)}")
        print(f"Pièces jointes: {result.get('attachments_count', 0)}")
        
        # Afficher le nombre d'images HTML si l'extracteur est disponible
        if HTML_IMAGE_EXTRACTOR_AVAILABLE and args.extract_html_images:
            print(f"Images HTML: {len(html_images)}")
            
        if md_file_path:
            print(f"Rapport Markdown: {md_file_path}")
        
    except Exception as e:
        print(f"Une erreur est survenue: {e}")
        sys.exit(1)

if __name__ == "__main__":
    main()
