from __future__ import annotations

from typing import Any

from app.core.config import get_settings
from app.scrapers.api_scrapers import ArbeitnowScraper, RemotiveScraper, RemoteOKScraper
from app.scrapers.base import BaseScraper
from app.scrapers.bridge import BridgePortalScraper, make_bridge_class
from app.scrapers.extra_scrapers import (
    GetOnBoardScraper,
    HimalayasScraper,
    InfoempleoScraper,
    JobicyScraper,
    JoobleScraper,
    LandingJobsScraper,
    LinkedInJobsScraper,
    WorkingNomadsScraper,
)
from app.scrapers.html_scrapers import (
    IndeedScraper,
    InfoJobsScraper,
    TecnoempleoScraper,
    WeWorkRemotelyScraper,
)
from app.services.portal_catalog import ES_BRIDGE_SOURCES, INTL_BRIDGE_SOURCES

SCRAPER_CLASSES: dict[str, type[BaseScraper]] = {
    "remoteok": RemoteOKScraper,
    "remotive": RemotiveScraper,
    "arbeitnow": ArbeitnowScraper,
    "weworkremotely": WeWorkRemotelyScraper,
    "infojobs": InfoJobsScraper,
    "tecnoempleo": TecnoempleoScraper,
    "indeed": IndeedScraper,
    "linkedin": LinkedInJobsScraper,
    "himalayas": HimalayasScraper,
    "jobicy": JobicyScraper,
    "getonboard": GetOnBoardScraper,
    "jooble": JoobleScraper,
    "infoempleo": InfoempleoScraper,
    "workingnomads": WorkingNomadsScraper,
    "landingjobs": LandingJobsScraper,
}

for _src in ES_BRIDGE_SOURCES + INTL_BRIDGE_SOURCES:
    _k = _src["key"]
    if _k not in SCRAPER_CLASSES:
        SCRAPER_CLASSES[_k] = make_bridge_class(_k, _src["name"])


def get_scraper(key: str, config: dict[str, Any] | None = None) -> BaseScraper:
    settings = get_settings()
    if key == "manual":
        # Manual no scrapea automáticamente
        return BridgePortalScraper(
            config={
                **(config or {}),
                "key": "manual",
                "name": "Manual",
                "search_url_template": "https://www.google.com/search?q={query}+empleo",
                "queries": ["pega URL en Fuentes"],
            },
            user_agent=settings.user_agent,
            portal_key="manual",
            portal_name="Manual",
        )
    cls = SCRAPER_CLASSES.get(key)
    if not cls:
        # Fallback bridge genérico
        return BridgePortalScraper(
            config={**(config or {}), "key": key, "name": key},
            user_agent=settings.user_agent,
            portal_key=key,
            portal_name=key,
        )
    return cls(config=config or {}, user_agent=settings.user_agent)
