"""
Aplicación de gestión de contactos con MongoDB
Permite agregar, ver y eliminar contactos sin duplicar nombres
"""

from pymongo import MongoClient
from pymongo.errors import ServerSelectionTimeoutError, DuplicateKeyError
from config import MONGODB_URI, DATABASE_NAME, COLLECTION_NAME
import sys


class ContactosDB:
    """Clase para gestionar la base de datos de contactos"""
    
    def __init__(self):
        """Inicializar conexión a MongoDB"""
        try:
            self.client = MongoClient(MONGODB_URI, serverSelectionTimeoutMS=5000)
            # Verificar conexión
            self.client.admin.command('ping')
            self.db = self.client[DATABASE_NAME]
            self.collection = self.db[COLLECTION_NAME]
            
            # Crear índice único para el campo 'nombre'
            self.collection.create_index("nombre", unique=True)
            print("✓ Conectado a MongoDB exitosamente")
        except ServerSelectionTimeoutError:
            print("✗ Error: No se pudo conectar a MongoDB. Verifica tu URI.")
            sys.exit(1)
        except Exception as e:
            print(f"✗ Error de conexión: {e}")
            sys.exit(1)
    
    def agregar_contacto(self, nombre, grupo, telefono):
        """
        Agregar un nuevo contacto
        
        Args:
            nombre: Nombre del contacto (único)
            grupo: Grupo del contacto
            telefono: Teléfono del contacto
        """
        try:
            contacto = {
                "nombre": nombre,
                "grupo": grupo,
                "telefono": telefono
            }
            resultado = self.collection.insert_one(contacto)
            print(f"✓ Contacto '{nombre}' agregado exitosamente (ID: {resultado.inserted_id})")
            return True
        except DuplicateKeyError:
            print(f"✗ Error: Ya existe un contacto con el nombre '{nombre}'")
            return False
        except Exception as e:
            print(f"✗ Error al agregar contacto: {e}")
            return False
    
    def ver_contactos(self):
        """Mostrar todos los contactos"""
        try:
            contactos = list(self.collection.find())
            
            if not contactos:
                print("No hay contactos registrados.")
                return
            
            print("\n" + "="*60)
            print(f"{'Nombre':<20} {'Grupo':<15} {'Teléfono':<15}")
            print("="*60)
            
            for contacto in contactos:
                nombre = contacto.get("nombre", "N/A")
                grupo = contacto.get("grupo", "N/A")
                telefono = contacto.get("telefono", "N/A")
                print(f"{nombre:<20} {grupo:<15} {telefono:<15}")
            
            print("="*60)
            print(f"Total de contactos: {len(contactos)}\n")
        except Exception as e:
            print(f"✗ Error al obtener contactos: {e}")
    
    def eliminar_contacto(self, nombre):
        """
        Eliminar un contacto por nombre
        
        Args:
            nombre: Nombre del contacto a eliminar
        """
        try:
            resultado = self.collection.delete_one({"nombre": nombre})
            
            if resultado.deleted_count > 0:
                print(f"✓ Contacto '{nombre}' eliminado exitosamente")
                return True
            else:
                print(f"✗ No se encontró contacto con el nombre '{nombre}'")
                return False
        except Exception as e:
            print(f"✗ Error al eliminar contacto: {e}")
            return False
    
    def cerrar_conexion(self):
        """Cerrar la conexión a MongoDB"""
        self.client.close()


def mostrar_menu():
    """Mostrar el menú principal"""
    print("\n" + "="*60)
    print("GESTOR DE CONTACTOS - MongoDB")
    print("="*60)
    print("1. Agregar nuevo contacto")
    print("2. Ver todos los contactos")
    print("3. Eliminar contacto")
    print("4. Salir")
    print("="*60)


def main():
    """Función principal"""
    db = ContactosDB()
    
    while True:
        mostrar_menu()
        opcion = input("Selecciona una opción (1-4): ").strip()
        
        if opcion == "1":
            print("\n--- Agregar Contacto ---")
            nombre = input("Nombre: ").strip()
            if not nombre:
                print("✗ El nombre no puede estar vacío")
                continue
            
            grupo = input("Grupo: ").strip()
            if not grupo:
                print("✗ El grupo no puede estar vacío")
                continue
            
            telefono = input("Teléfono: ").strip()
            if not telefono:
                print("✗ El teléfono no puede estar vacío")
                continue
            
            db.agregar_contacto(nombre, grupo, telefono)
        
        elif opcion == "2":
            print("\n--- Contactos ---")
            db.ver_contactos()
        
        elif opcion == "3":
            print("\n--- Eliminar Contacto ---")
            nombre = input("Nombre del contacto a eliminar: ").strip()
            if nombre:
                db.eliminar_contacto(nombre)
            else:
                print("✗ El nombre no puede estar vacío")
        
        elif opcion == "4":
            print("\n✓ Aplicación cerrada correctamente")
            db.cerrar_conexion()
            break
        
        else:
            print("✗ Opción no válida. Intenta de nuevo.")


if __name__ == "__main__":
    main()
