from ticket_manager import TicketManager
from utils import print_error

# Initialisation de l'objet
ticket_manager = TicketManager()

def handle_list_models():
    """Affiche et sauvegarde la liste des modèles disponibles"""
    models = ticket_manager.get_all_models()
    if models:
        print("\n Modèles disponibles:")
        for model, name in models.items():
            print(f"- {model} : {name}")
            
def handle_list_model_fields():
    """Demande à l'utilisateur un modèle et affiche ses champs avec leur type."""
    model_name = input("\nEntrez le nom du modèle à inspecter (ou 'q' pour quitter): ")
    if model_name.lower() == 'q':
        return
    
    fields = ticket_manager.get_model_fields_with_types(model_name)
    if fields:
        print(f"\nChamps du modèle '{model_name}':")
        for field, info in fields.items():
            relation_info = f" (relation avec {info['relation']})" if info["relation"] else ""
            print(f"- {field} : {info['type']}{relation_info}")

def handle_search_ticket_by_id():
    """Gère la recherche d'un ticket par ID"""
    ticket_id_input = input("Entrez l'ID du ticket(ou 'q' pour quitter): ")
    if ticket_id_input.lower() == 'q':
        return
    try:
        ticket_id = int(ticket_id_input)
    except ValueError:
        print_error("L'ID du ticket doit être un n ombre entier.")
        return
    
    ticket = ticket_manager.get_ticket_by_id(ticket_id)
    if ticket:
        print("\n Ticket trouvé:")
        print(ticket)
    else:
        print_error(f"Aucun ticket trouvé avec l'ID: {ticket_id}")
        
def handle_search_ticket_by_code():
    """Recherche un ticket via son code"""
    ticket_code = input("\nEntrez le code du ticket à rechercher (ou 'q' pour quitter): ")
    if ticket_code.lower() == 'q':
        return
    
    ticket = ticket_manager.get_ticket_by_code(ticket_code)
    if ticket:
        print("\n Ticket trouvé:")
        print(ticket)
    else:
        print_error(f"Aucun ticket trouvé avec le code '{ticket_code}'.")
  
def handle_project_tickets_by_stage():
    """Gère l'exportation des tickets d'un projet par étape"""
    # Récupérer la liste des projets disponibles
    projects = ticket_manager.get_available_projects()
    if not projects:
        print("Aucun projet disponible. Impossible de continuer.")
        return
 
    # Afficher les projets disponibles pour aider l'utilisateur
    print("\nProjets disponibles:")
    for proj_id, proj_name in projects.items():
        print(f"- ID: {proj_id} - Nom: {proj_name}")
    
    # Demander à l'utilisateur de choisir un projet
    project_id_input = input("\nEntrez l'ID du projet (ou 'q' pour quitter, 0 pour tous): ")
    if project_id_input.lower() == 'q':
        return
    
    project_id = None
    if project_id_input != '0':
        try:
            project_id = int(project_id_input)
            if project_id not in projects.keys():
                print_error(f"Aucun projet trouvé avec l'ID: {project_id}")
                return
        except ValueError:
            print("L'ID du projet doit être un nombre entier.")
            return
    
    # Demander à l'utilisateur s'il souhaite filtrer par étape également
    filter_by_stage = input("\nSouhaitez-vous filtrer par étape aussi? (o/n): ").lower() == 'o'
    
    stage_id = None
    if filter_by_stage:
        # Récupérer et afficher les étapes disponibles
        stages = ticket_manager._safe_execute('project.task.type', 'search_read', [], ['id', 'name'])
        if stages:
            print("\nÉtapes disponibles:")
            for stage in stages:
                print(f"- ID: {stage['id']} - Nom: {stage['name']}")
            
            stage_id_input = input("\nEntrez l'ID de l'étape (ou 'q' pour quitter, 0 pour toutes): ")
            if stage_id_input.lower() == 'q':
                return
            
            if stage_id_input != '0':
                try:
                    stage_id = int(stage_id_input)
                    # Vérifier que l'étape existe
                    stage_exists = any(stage['id'] == stage_id for stage in stages)
                    if not stage_exists:
                        print_error(f"Aucune étape trouvée avec l'ID: {stage_id}")
                        return
                except ValueError:
                    print("L'ID de l'étape doit être un nombre entier.")
                    return
    
    # Exporter les tickets selon les filtres choisis
    ticket_manager.export_tickets_by_project_and_stage(project_id, stage_id)