"""Conector bridge genérico para portales sin scrape HTML estable."""

from __future__ import annotations

from typing import Any
from urllib.parse import quote_plus

from app.scrapers.base import BaseScraper, JobDTO
from app.scrapers.html_scrapers import hashlib_id


class BridgePortalScraper(BaseScraper):
    """Genera entradas de búsqueda profesionales (bridge) por query."""

    key = "bridge"
    name = "Bridge Portal"

    def __init__(self, config: dict[str, Any] | None = None, user_agent: str = "", *, portal_key: str = "", portal_name: str = ""):
        super().__init__(config=config or {}, user_agent=user_agent)
        if portal_key:
            self.key = portal_key
        if portal_name:
            self.name = portal_name
        cfg = self.config
        if cfg.get("key"):
            self.key = str(cfg["key"])
        if cfg.get("name"):
            self.name = str(cfg["name"])

    def fetch(self) -> list[JobDTO]:
        template = self.config.get("search_url_template") or "https://www.google.com/search?q={query}+jobs"
        queries = list(self.config.get("queries") or [])
        main_q = self.config.get("query")
        if main_q and main_q not in queries:
            queries.insert(0, main_q)
        if not queries:
            queries = ["empleo", "jobs", "remote"]
        location = self.config.get("location") or ""
        jobs: list[JobDTO] = []
        for q in queries[:8]:
            url = template.format(
                query=quote_plus(str(q)),
                location=quote_plus(str(location)),
                qlen=len(str(q)),
            )
            # Algunos templates no usan quote — tolerar si ya vienen encoded
            if "{query}" in url or "{location}" in url:
                url = template.replace("{query}", quote_plus(str(q))).replace(
                    "{location}", quote_plus(str(location))
                ).replace("{qlen}", str(len(str(q))))
            jobs.append(
                JobDTO(
                    external_id=f"bridge-{self.key}-{hashlib_id(url)[:12]}",
                    source=self.key,
                    title=f"[{self.name}] {q}" + (f" · {location}" if location else ""),
                    company=self.name,
                    location=location or ("España" if self.key.endswith("_es") or "es" in self.key else "International"),
                    remote="remote" in str(q).lower() or "remoto" in str(q).lower() or "teletrabajo" in str(q).lower(),
                    url=url,
                    description=(
                        f"Conector profesional de JobsWorld para {self.name}. "
                        f"Abre el enlace para ver ofertas actuales de «{q}». "
                        "También puedes pegar URLs concretas en Fuentes → Manual."
                    ),
                    lang="es" if location.lower() in ("españa", "spain", "valencia", "") or self.key.endswith("_es") else "en",
                    tags=["bridge", "connector", self.key],
                    hire_from_spain_ok=True,
                    raw={"bridge": True, "query": q, "template": template},
                )
            )
        return jobs


def make_bridge_class(portal_key: str, portal_name: str) -> type[BridgePortalScraper]:
    class _Portal(BridgePortalScraper):
        key = portal_key
        name = portal_name

        def __init__(self, config: dict[str, Any] | None = None, user_agent: str = ""):
            merged = dict(config or {})
            merged.setdefault("key", portal_key)
            merged.setdefault("name", portal_name)
            super().__init__(config=merged, user_agent=user_agent, portal_key=portal_key, portal_name=portal_name)

    _Portal.__name__ = f"Bridge_{portal_key}"
    return _Portal
