"""Catálogo comercial de portales ES (~30) + internacionales."""

from __future__ import annotations

from typing import Any

# Campos: key, name, region, category, tier_min, priority, connector_type, enabled, config
# tier_min: 0=free, 1=esencial, 2=profesional, 3=carrera_max

PortalDef = dict[str, Any]


def _bridge(
    key: str,
    name: str,
    *,
    region: str,
    search_url: str,
    category: str = "general",
    tier_min: int = 0,
    priority: int = 50,
    queries: list[str] | None = None,
    location: str = "",
    enabled: bool = True,
) -> PortalDef:
    return {
        "key": key,
        "name": name,
        "enabled": enabled,
        "region": region,
        "category": category,
        "tier_min": tier_min,
        "priority": priority,
        "connector_type": "bridge",
        "config": {
            "search_url_template": search_url,
            "queries": queries
            or [
                "empleo",
                "trabajo",
                "oferta laboral",
            ],
            "location": location,
            "bridge": True,
        },
    }


# --- Scrapers reales existentes (metadatos comerciales) ---
CORE_SOURCES: list[PortalDef] = [
    {
        "key": "infojobs",
        "name": "InfoJobs",
        "enabled": True,
        "region": "es",
        "category": "general",
        "tier_min": 0,
        "priority": 10,
        "connector_type": "html",
        "config": {
            "query": "empleo",
            "location": "Valencia",
            "queries": ["empleo", "trabajo remoto", "teletrabajo", "Valencia"],
        },
    },
    {
        "key": "infoempleo",
        "name": "Infoempleo",
        "enabled": True,
        "region": "es",
        "category": "general",
        "tier_min": 0,
        "priority": 12,
        "connector_type": "html",
        "config": {
            "query": "empleo",
            "location": "España",
            "queries": ["empleo", "teletrabajo", "Valencia"],
        },
    },
    {
        "key": "tecnoempleo",
        "name": "Tecnoempleo",
        "enabled": True,
        "region": "es",
        "category": "tech",
        "tier_min": 0,
        "priority": 14,
        "connector_type": "html",
        "config": {
            "query": "desarrollador OR sistemas OR analista",
            "location": "Valencia",
            "queries": ["desarrollador", "devops", "sistemas", "Valencia"],
        },
    },
    {
        "key": "jooble",
        "name": "Jooble ES",
        "enabled": True,
        "region": "es",
        "category": "general",
        "tier_min": 0,
        "priority": 16,
        "connector_type": "html",
        "config": {
            "query": "empleo",
            "location": "Valencia",
            "queries": ["empleo Valencia", "teletrabajo España", "trabajo remoto"],
        },
    },
    {
        "key": "linkedin",
        "name": "LinkedIn Empleos",
        "enabled": True,
        "region": "es",
        "category": "general",
        "tier_min": 0,
        "priority": 8,
        "connector_type": "html",
        "config": {
            "location": "Spain",
            "queries": [
                "empleo",
                "trabajo remoto",
                "teletrabajo",
                "Valencia",
                "Madrid",
                "Barcelona",
            ],
        },
    },
    {
        "key": "indeed",
        "name": "Indeed",
        "enabled": True,
        "region": "intl",
        "category": "general",
        "tier_min": 1,
        "priority": 20,
        "connector_type": "html",
        "config": {
            "query": "jobs",
            "location": "Spain",
            "queries": ["remote", "Spain", "Valencia"],
        },
    },
    {
        "key": "remoteok",
        "name": "RemoteOK",
        "enabled": True,
        "region": "intl",
        "category": "tech",
        "tier_min": 2,
        "priority": 22,
        "connector_type": "api",
        "config": {"tag": ""},
    },
    {
        "key": "remotive",
        "name": "Remotive",
        "enabled": True,
        "region": "intl",
        "category": "general",
        "tier_min": 2,
        "priority": 24,
        "connector_type": "api",
        "config": {"category": ""},
    },
    {
        "key": "weworkremotely",
        "name": "We Work Remotely",
        "enabled": True,
        "region": "intl",
        "category": "general",
        "tier_min": 2,
        "priority": 26,
        "connector_type": "html",
        "config": {},
    },
    {
        "key": "arbeitnow",
        "name": "Arbeitnow",
        "enabled": True,
        "region": "intl",
        "category": "general",
        "tier_min": 1,
        "priority": 28,
        "connector_type": "api",
        "config": {},
    },
    {
        "key": "himalayas",
        "name": "Himalayas",
        "enabled": True,
        "region": "intl",
        "category": "general",
        "tier_min": 2,
        "priority": 30,
        "connector_type": "api",
        "config": {},
    },
    {
        "key": "jobicy",
        "name": "Jobicy",
        "enabled": True,
        "region": "intl",
        "category": "general",
        "tier_min": 2,
        "priority": 32,
        "connector_type": "api",
        "config": {"tag": ""},
    },
    {
        "key": "getonboard",
        "name": "Get on Board",
        "enabled": True,
        "region": "latam",
        "category": "tech",
        "tier_min": 1,
        "priority": 34,
        "connector_type": "api",
        "config": {},
    },
    {
        "key": "workingnomads",
        "name": "Working Nomads",
        "enabled": True,
        "region": "intl",
        "category": "tech",
        "tier_min": 2,
        "priority": 36,
        "connector_type": "api",
        "config": {},
    },
    {
        "key": "landingjobs",
        "name": "Landing.jobs",
        "enabled": True,
        "region": "intl",
        "category": "tech",
        "tier_min": 2,
        "priority": 38,
        "connector_type": "html",
        "config": {},
    },
    {
        "key": "manual",
        "name": "Manual / pegar URL",
        "enabled": True,
        "region": "es",
        "category": "general",
        "tier_min": 0,
        "priority": 5,
        "connector_type": "bridge",
        "config": {},
    },
]

ES_BRIDGE_SOURCES: list[PortalDef] = [
    _bridge(
        "indeed_es",
        "Indeed España",
        region="es",
        search_url="https://es.indeed.com/jobs?q={query}&l={location}",
        tier_min=0,
        priority=11,
        location="España",
        queries=["empleo", "teletrabajo", "Valencia", "Madrid"],
    ),
    _bridge(
        "milanuncios",
        "Milanuncios Empleo",
        region="es",
        search_url="https://www.milanuncios.com/ofertas-de-empleo/?q={query}",
        tier_min=0,
        priority=40,
        queries=["empleo", "trabajo", "Valencia"],
    ),
    _bridge(
        "trabajando_es",
        "Trabajando.es",
        region="es",
        search_url="https://www.trabajando.es/ofertas-empleo/{query}",
        tier_min=0,
        priority=41,
    ),
    _bridge(
        "jobatus",
        "Jobatus",
        region="es",
        search_url="https://www.jobatus.es/empleo?q={query}",
        tier_min=0,
        priority=42,
    ),
    _bridge(
        "trovit_empleo",
        "Trovit Empleo",
        region="es",
        search_url="https://empleo.trovit.es/index.php/cod.search_jobs/what_d.{query}/where_d.{location}",
        tier_min=0,
        priority=43,
        location="España",
    ),
    _bridge(
        "jobijoba",
        "Jobijoba",
        region="es",
        search_url="https://www.jobijoba.es/empleo?what={query}&where={location}",
        tier_min=0,
        priority=44,
        location="España",
    ),
    _bridge(
        "computrabajo_es",
        "Computrabajo España",
        region="es",
        search_url="https://es.computrabajo.com/trabajo-de-{query}",
        tier_min=0,
        priority=45,
    ),
    _bridge(
        "empleate",
        "Empléate (SEPE)",
        region="es",
        search_url="https://www.empleate.gob.es/empleo/#/ofertas?search={query}",
        tier_min=0,
        priority=15,
        queries=["empleo", "Valencia", "teletrabajo"],
    ),
    _bridge(
        "domestiko",
        "Domestiko",
        region="es",
        category="services",
        search_url="https://www.domestiko.com/anuncios?q={query}",
        tier_min=0,
        priority=55,
        queries=["limpieza", "cuidado", "hogar"],
    ),
    _bridge(
        "ticjob",
        "Ticjob",
        region="es",
        category="tech",
        search_url="https://ticjob.es/esp/busqueda?q={query}",
        tier_min=0,
        priority=46,
        queries=["desarrollador", "sistemas", "datos"],
    ),
    _bridge(
        "jobteaser_es",
        "JobTeaser ES",
        region="es",
        category="junior",
        search_url="https://www.jobteaser.com/es/job-offers?query={query}",
        tier_min=0,
        priority=47,
    ),
    _bridge(
        "graduateland_es",
        "Graduateland ES",
        region="es",
        category="junior",
        search_url="https://graduateland.com/es/jobs?q={query}",
        tier_min=0,
        priority=48,
    ),
    _bridge(
        "bebee_es",
        "BeBee ES",
        region="es",
        search_url="https://es.bebee.com/jobs?q={query}",
        tier_min=0,
        priority=49,
    ),
    _bridge(
        "randstad_es",
        "Randstad España",
        region="es",
        search_url="https://www.randstad.es/candidatos/ofertas-empleo/?q={query}",
        tier_min=0,
        priority=50,
    ),
    _bridge(
        "adecco_es",
        "Adecco España",
        region="es",
        search_url="https://www.adecco.es/ofertas-empleo?Keyword={query}",
        tier_min=0,
        priority=51,
    ),
    _bridge(
        "manpower_es",
        "Manpower España",
        region="es",
        search_url="https://www.manpower.es/candidatos/ofertas?q={query}",
        tier_min=0,
        priority=52,
    ),
    _bridge(
        "michaelpage_es",
        "Michael Page ES",
        region="es",
        category="executive",
        search_url="https://www.michaelpage.es/jobs?keywords={query}",
        tier_min=2,
        priority=53,
    ),
    _bridge(
        "hays_es",
        "Hays España",
        region="es",
        category="executive",
        search_url="https://www.hays.es/job/?q={query}",
        tier_min=2,
        priority=54,
    ),
    _bridge(
        "robertwalters_es",
        "Robert Walters ES",
        region="es",
        category="executive",
        search_url="https://www.robertwalters.es/jobs.html?k={query}",
        tier_min=2,
        priority=56,
    ),
    _bridge(
        "experteer_es",
        "Experteer ES",
        region="es",
        category="executive",
        search_url="https://www.experteer.es/job_offers?keywords={query}",
        tier_min=3,
        priority=57,
    ),
    _bridge(
        "glassdoor_es",
        "Glassdoor ES",
        region="es",
        search_url="https://www.glassdoor.es/Empleo/{query}-empleos-SRCH_KO0,{qlen}.htm",
        tier_min=2,
        priority=58,
        queries=["empleo", "remoto", "Valencia"],
    ),
    _bridge(
        "infojobs_autonomos",
        "InfoJobs Autónomos",
        region="es",
        category="freelance",
        search_url="https://www.infojobs.net/jobsearch/search-results/list.xhtml?keyword={query}&segmentIdActual=1",
        tier_min=0,
        priority=59,
    ),
    _bridge(
        "stepstone_es",
        "StepStone / Totaljobs ES",
        region="es",
        search_url="https://www.stepstone.es/trabajos/{query}",
        tier_min=2,
        priority=60,
    ),
    _bridge(
        "xing_jobs_es",
        "XING Jobs ES",
        region="es",
        search_url="https://www.xing.com/jobs/search?keywords={query}&location={location}",
        tier_min=2,
        priority=61,
        location="Spain",
    ),
    _bridge(
        "tuempleo",
        "Tu Empleo / portales ETT",
        region="es",
        search_url="https://www.google.com/search?q={query}+empleo+España+site:infojobs.net+OR+site:infoempleo.com",
        tier_min=0,
        priority=62,
    ),
    _bridge(
        "monster_es",
        "Monster España",
        region="es",
        search_url="https://www.monster.es/empleo/buscar/?q={query}&where={location}",
        tier_min=0,
        priority=63,
        location="España",
    ),
    _bridge(
        "tipempleo",
        "Tip Empleo",
        region="es",
        search_url="https://www.google.com/search?q=site:tipempleo.com+{query}",
        tier_min=0,
        priority=64,
    ),
    _bridge(
        "opcionempleo",
        "Opcionempleo",
        region="es",
        search_url="https://www.opcionempleo.com/empleo-{query}.html",
        tier_min=0,
        priority=65,
    ),
    _bridge(
        "jobandtalent_es",
        "Jobandtalent ES",
        region="es",
        search_url="https://www.jobandtalent.com/es/jobs?q={query}",
        tier_min=0,
        priority=66,
    ),
    _bridge(
        "cornerjob",
        "CornerJob",
        region="es",
        search_url="https://www.google.com/search?q={query}+empleo+CornerJob+España",
        tier_min=0,
        priority=67,
        queries=["camarero", "repartidor", "empleo"],
    ),
]

INTL_BRIDGE_SOURCES: list[PortalDef] = [
    _bridge(
        "linkedin_worldwide",
        "LinkedIn Worldwide",
        region="intl",
        search_url="https://www.linkedin.com/jobs/search/?keywords={query}&location={location}",
        tier_min=2,
        priority=21,
        location="Worldwide",
        queries=["remote", "Spain", "Europe", "manager", "engineer", "nurse", "sales"],
    ),
    _bridge(
        "otta",
        "Otta",
        region="intl",
        category="tech",
        search_url="https://otta.com/jobs?q={query}",
        tier_min=2,
        priority=70,
    ),
    _bridge(
        "wellfound",
        "Wellfound (AngelList)",
        region="intl",
        category="startup",
        search_url="https://wellfound.com/jobs?q={query}",
        tier_min=2,
        priority=71,
    ),
    _bridge(
        "flexjobs",
        "FlexJobs",
        region="intl",
        search_url="https://www.flexjobs.com/search?searchkeyword={query}",
        tier_min=3,
        priority=72,
    ),
    _bridge(
        "dice",
        "Dice",
        region="intl",
        category="tech",
        search_url="https://www.dice.com/jobs?q={query}",
        tier_min=2,
        priority=73,
    ),
    _bridge(
        "remote_co",
        "Remote.co",
        region="intl",
        search_url="https://remote.co/remote-jobs/search/?search_keywords={query}",
        tier_min=2,
        priority=74,
    ),
    _bridge(
        "justremote",
        "JustRemote",
        region="intl",
        search_url="https://justremote.co/remote-jobs?q={query}",
        tier_min=2,
        priority=75,
    ),
    _bridge(
        "eurojobs",
        "EuroJobs",
        region="intl",
        search_url="https://eurojobs.com/search?q={query}",
        tier_min=2,
        priority=76,
    ),
    _bridge(
        "eures",
        "EURES (EU)",
        region="intl",
        search_url="https://europa.eu/eures/portal/jv-se/home?keyword={query}",
        tier_min=1,
        priority=25,
        queries=["empleo", "nurse", "engineer", "teacher", "remote"],
    ),
    _bridge(
        "relocate_me",
        "Relocate.me",
        region="intl",
        search_url="https://relocate.me/search?q={query}",
        tier_min=3,
        priority=77,
    ),
    _bridge(
        "jobspresso",
        "Jobspresso",
        region="intl",
        search_url="https://jobspresso.co/?s={query}",
        tier_min=2,
        priority=78,
    ),
    _bridge(
        "indeed_uk",
        "Indeed UK",
        region="intl",
        search_url="https://uk.indeed.com/jobs?q={query}&l={location}",
        tier_min=2,
        priority=79,
        location="United Kingdom",
    ),
    _bridge(
        "indeed_us",
        "Indeed USA",
        region="intl",
        search_url="https://www.indeed.com/jobs?q={query}&l={location}",
        tier_min=2,
        priority=80,
        location="Remote",
    ),
    _bridge(
        "greenhouse_boards",
        "Greenhouse boards",
        region="intl",
        category="ats",
        search_url="https://www.google.com/search?q={query}+site:boards.greenhouse.io",
        tier_min=3,
        priority=81,
    ),
    _bridge(
        "lever_boards",
        "Lever boards",
        region="intl",
        category="ats",
        search_url="https://www.google.com/search?q={query}+site:jobs.lever.co",
        tier_min=3,
        priority=82,
    ),
]


def all_portal_definitions() -> list[PortalDef]:
    seen: set[str] = set()
    out: list[PortalDef] = []
    for group in (CORE_SOURCES, ES_BRIDGE_SOURCES, INTL_BRIDGE_SOURCES):
        for item in group:
            if item["key"] in seen:
                continue
            seen.add(item["key"])
            out.append(item)
    return out
