# -*- coding: utf-8 -*-
"""
Gestión del repositorio local y actualización de HTML del portal.

- buscar_archivo_a_reemplazar: decide si hay que actualizar según versiones.
- modificar_htmls: actualiza href y textos de versión en los HTML.
- _gestionar_archivo_antiguo: elimina el instalador anterior tras actualizar.
"""

import logging
import re
import os

from bs4 import BeautifulSoup

from . import config
from . import utils


def buscar_archivo_a_reemplazar(version_descargada, nombre):
    """
    Comprueba si en el repositorio ya existe una versión de la aplicación y si
    la nueva versión es mayor.

    Formato esperado de archivos: nombre_version.extension (ej. digikam_8.5.0.exe).

    Returns:
        Nombre del archivo antiguo a borrar si hay actualización;
        'primera descarga' si no hay archivo previo;
        None si ya tenemos la versión más reciente o superior.
    """
    try:
        if not os.path.exists(config.REPO_DIR):
            return "primera descarga"
        nombre_lower = nombre.lower()
        pattern_archivo = rf"{re.escape(nombre_lower)}_(\d[\d.]*\d|\d+)"
        for filename in os.listdir(config.REPO_DIR):
            if filename.lower().startswith(nombre_lower + "_"):
                match = re.search(pattern_archivo, filename.lower())
                if match:
                    version_existente = match.group(1)
                    logging.debug(f"{nombre}: Archivo existente {filename} -> versión {version_existente}")
                    if version_descargada and version_existente:
                        if utils.comparar_versiones(version_descargada, version_existente) > 0:
                            logging.info(
                                f"{nombre}: Nueva versión disponible ({version_existente} -> {version_descargada})"
                            )
                            return filename
                        if utils.comparar_versiones(version_descargada, version_existente) < 0:
                            logging.warning(
                                f"{nombre}: upstream ({version_descargada}) < local ({version_existente})"
                            )
                        else:
                            logging.info(f"{nombre}: Ya tenemos la versión más reciente ({version_existente})")
                        return None
        return "primera descarga"
    except Exception as e:
        utils.registrar_error(f"Error en buscar_archivo_a_reemplazar: {e}")
        return "primera descarga"


def modificar_htmls(html_files, enlace, version, aplicacion):
    """
    Actualiza los archivos HTML del portal: href del enlace de descarga y
    textos de versión (span o li con id "{app}_version").
    """
    codificaciones = ["UTF-8", "iso-8859-15", "latin1", "windows-1252"]
    for index, html_file in enumerate(html_files):
        ruta = (
            config.WEB_DIR_SINGLE + html_file
            if index == 0
            else config.WEB_DIR_MULTI + html_file
        )
        if not os.path.exists(ruta):
            logging.warning(f"Archivo HTML no encontrado, omitiendo: {ruta}")
            continue
        for codificacion in codificaciones:
            try:
                with open(ruta, "r", encoding=codificacion) as f:
                    html_content = f.read()
                soup = BeautifulSoup(html_content, "html.parser")
                app_id = aplicacion.lower()
                link = soup.find("a", id=app_id)
                if link:
                    link["href"] = f"https://softlibre.unizar.es/estandares/aplicacion/{enlace}"
                li = soup.find("li", id=f"{app_id}_version")
                if li:
                    strong_tag = li.find("strong")
                    if strong_tag:
                        texto_despues = strong_tag.find_next_sibling(string=True)
                        if texto_despues:
                            texto_despues.replace_with(f" {version}")

                span_btn = soup.find("span", id=f"{app_id}_version_btn")
                if span_btn:
                    span_btn.string = version

                if not li:
                    span = soup.find("span", id=f"{app_id}_version")
                    if span:
                        span.string = version
                with open(ruta, "w", encoding="UTF-8") as f:
                    f.write(str(soup))
                break
            except UnicodeDecodeError:
                logging.warning(f"No se pudo abrir {ruta} con codificación {codificacion}")
            except Exception as e:
                utils.registrar_error(f"Error modificando HTML {ruta}: {e}")


def gestionar_archivo_antiguo(archivo_a_reemplazar, nombre_completo, nombre):
    """Elimina el archivo de la versión anterior tras una actualización exitosa."""
    if archivo_a_reemplazar != "primera descarga":
        archivo_antiguo = f"{config.REPO_DIR}{archivo_a_reemplazar}"
        if os.path.exists(archivo_antiguo):
            try:
                os.remove(archivo_antiguo)
                logging.info(f"{nombre}: Archivo reemplazado: {archivo_a_reemplazar} -> {nombre_completo}")
            except OSError as e:
                utils.registrar_error(f"{nombre}: No se pudo borrar archivo antiguo: {e}")
    else:
        logging.info(f"{nombre}: Primera descarga completada")
