# utils/markdown_handler.py
import os
import re
from datetime import datetime
from models.mensaje_email import MensajeEmail


def cargar_cronologia_existente(archivo):
    """
    Carga mensajes existentes desde un archivo de cronología en formato markdown.
    Formato esperado:
    + hash

    ### Subject

    - fecha

    Contenido...

    ### Adjuntos (opcional)
    - [[archivo1]]
    ---
    """
    mensajes = []
    if not os.path.exists(archivo):
        print(f"Archivo de cronología no existe: {archivo}")
        return mensajes

    print(f"Cargando cronología existente desde: {archivo}")

    with open(archivo, "r", encoding="utf-8") as f:
        contenido = f.read()

    # Saltar el índice inicial si existe (hasta el primer ---\n\n)
    if contenido.startswith("# Índice de Mensajes"):
        partes = contenido.split("---\n\n", 1)
        if len(partes) > 1:
            contenido = partes[1]
        else:
            print("Archivo solo contiene índice, no hay mensajes")
            return mensajes

    # Dividir por separadores de mensaje
    bloques = contenido.split("---\n\n")

    print(f"Encontrados {len(bloques)} bloques para procesar")

    for i, bloque in enumerate(bloques):
        if not bloque.strip():
            continue

        try:
            # Buscar el patrón: + hash, ### subject, - fecha, contenido
            lineas = bloque.strip().split("\n")

            # Encontrar hash
            hash_msg = None
            subject = None
            fecha = None
            contenido_inicio = 0

            for j, linea in enumerate(lineas):
                if linea.startswith("+ ") and not hash_msg:
                    hash_msg = linea[2:].strip()
                elif linea.startswith("### ") and not subject:
                    subject = linea[4:].strip()
                elif linea.startswith("- ") and not fecha:
                    try:
                        fecha_str = linea[2:].strip()
                        fecha = datetime.strptime(fecha_str, "%d-%m-%Y")
                        contenido_inicio = j + 1
                        break
                    except ValueError:
                        continue

            if not hash_msg or not fecha:
                print(f"Bloque {i+1}: No se pudo extraer hash o fecha, saltando")
                continue

            # Extraer contenido y adjuntos
            contenido_lineas = lineas[contenido_inicio:]
            adjuntos = []

            # Buscar sección de adjuntos
            contenido_texto = []
            en_adjuntos = False

            for linea in contenido_lineas:
                if linea.strip() == "### Adjuntos":
                    en_adjuntos = True
                    continue

                if en_adjuntos:
                    if linea.startswith("- [[") and linea.endswith("]]"):
                        adjunto = linea[4:-2]  # Remover - [[ y ]]
                        adjuntos.append(adjunto)
                else:
                    contenido_texto.append(linea)

            # Unir contenido sin líneas vacías al final
            contenido_final = "\n".join(contenido_texto).strip()

            # Crear el mensaje sin especificar remitente ya que no está en el formato actual
            # El remitente se extraerá del contenido si es posible
            remitente = "Remitente Desconocido"  # valor por defecto

            # Intentar extraer remitente del contenido
            for linea in contenido_final.split("\n")[
                :5
            ]:  # revisar solo las primeras líneas
                if "From:" in linea or "De:" in linea or "Da:" in linea:
                    remitente = linea.strip()
                    break

            mensaje = MensajeEmail(
                remitente=remitente,
                fecha=fecha,
                contenido=contenido_final,
                subject=subject,
                adjuntos=adjuntos,
            )

            # Verificar que el hash coincida para validar
            if mensaje.hash == hash_msg:
                mensajes.append(mensaje)
                print(f"✓ Mensaje cargado: {subject} - {fecha.strftime('%d-%m-%Y')}")
            else:
                print(f"⚠ Hash no coincide para mensaje {subject}, regenerando...")
                # Si el hash no coincide, usar el hash original del archivo
                mensaje.hash = hash_msg
                mensajes.append(mensaje)

        except Exception as e:
            print(f"Error procesando bloque {i+1}: {str(e)}")
            print(f"Contenido del bloque: {bloque[:200]}...")
            continue

    print(
        f"Carga completada: {len(mensajes)} mensajes cargados desde cronología existente"
    )
    return mensajes
