#
# Erminig - Recupération de la dernière version d'un soft sur page html
# Copyright (C) 2025 L0m1g
# Sous licence DOUARN - Voir le fichier LICENCE pour les détails
#
# Ce fichier fait partie du projet Erminig.
# Libre comme l’air, stable comme un menhir, et salé comme le beurre.
#

import re
import requests
from erminig.controllers.evezh.abstract import UpstreamSource
from erminig.core.retry import retry_on_failure


class HttpSource(UpstreamSource):

    @retry_on_failure()
    def get_latest(self):
        base_url = self.config["url"]
        pattern = self.config["pattern"]
        file_pattern = self.config.get("file")

        response = requests.get(
            base_url, timeout=10
        )  # timeout pour éviter de bloquer éternellement
        response.raise_for_status()
        html = response.text

        matches = re.findall(pattern, html)
        if not matches:
            print(f"[{self.name}] Aucun match avec pattern : {pattern}")
            return None

        latest_dir = sorted(set(matches), key=self.version_key)[-1]
        version = self.extract_version(latest_dir)

        if file_pattern:
            filename = file_pattern.replace("${version}", version)
            url = f"{base_url}{latest_dir}{filename}"
        else:
            url = f"{base_url}{latest_dir}"

        print(url)

        return {"name": self.name, "version": version, "url": url}

    def extract_version(self, path):
        match = re.search(r"([0-9]+\.[0-9]+(?:\.[0-9]+)?)", path)
        return match.group(1) if match else path

    def version_key(self, ver):
        nums = re.findall(r"\d+", ver)
        return list(map(int, nums))
