# models/pagina_html.py
import os
import re
import hashlib
from pathlib import Path


class PaginaHTML:
    def __init__(self, ruta_archivo, titulo=None, contenido=None, imagenes=None):
        self.ruta_archivo = ruta_archivo
        self.nombre_archivo = Path(ruta_archivo).name
        self.titulo = titulo or self._extraer_titulo_de_ruta()
        self.contenido = contenido or ""
        self.hash = self._generar_hash()
        self.imagenes = imagenes or []  # Lista de imágenes asociadas a esta página

    def _extraer_titulo_de_ruta(self):
        """Extrae el título a partir del nombre del archivo."""
        nombre = Path(self.ruta_archivo).stem
        # Limpia el nombre: reemplaza guiones y underscores por espacios
        nombre = re.sub(r"[_-]", " ", nombre)
        # Capitaliza cada palabra
        nombre = " ".join(word.capitalize() for word in nombre.split())
        return nombre

    def _generar_hash(self):
        """Genera un hash único para la página."""
        elementos_hash = [
            self.nombre_archivo,
            self.titulo,
            (
                self.contenido[:500] if self.contenido else ""
            ),  # Usar solo los primeros 500 caracteres
        ]

        texto_hash = "|".join(elementos_hash)
        return hashlib.md5(texto_hash.encode()).hexdigest()

    def to_markdown(self):
        """Convierte la página a formato Markdown."""
        # Hash como comentario al principio
        hash_line = f"<!-- {self.hash} -->\n\n"

        # Título como encabezado
        titulo_line = f"## {self.titulo}\n\n"

        # Nombre del archivo original como referencia
        origen_line = f"*Origen: {self.nombre_archivo}*\n\n"

        # Contenido
        md = f"{hash_line}{titulo_line}{origen_line}"

        # Limpiar cualquier artefacto de asteriscos extra antes de agregar el contenido
        contenido_limpio = re.sub(r"(\*{3,}|\-{3,}|_{3,})", "---", self.contenido)
        md += contenido_limpio + "\n\n"

        # Ya no se agregan imágenes al final - se asume que están en el contenido

        md += "---\n\n"

        return md

    def get_index_entry(self):
        """Genera una entrada para el índice."""
        # Formatear el título para el enlace de Markdown
        slug = re.sub(r"[^\w\s-]", "", self.titulo.lower())
        slug = re.sub(r"\s+", "-", slug)

        return f"- [{self.titulo}](#{slug})"

    def add_imagen(self, imagen):
        """Añade una referencia a una imagen asociada a esta página."""
        if imagen not in self.imagenes:
            self.imagenes.append(imagen)
