"""Genera consultas (dorks) de motor de busqueda para investigar un target.

Funcion pura de OSINT pasivo: a partir de un target y su tipo (persona,
email, dominio o usuario) produce una lista de cadenas de busqueda listas
para pegar en un buscador. No toca la red.
"""


def build_search_dorks(
    target: str,
    tipo: str = "persona",
    extra_domains: list | None = None,
) -> list:
    """Genera dorks de motor de busqueda adaptados al tipo de target.

    Segun el tipo seleccionado produce las consultas mas utiles para
    investigar:

    - persona: nombre exacto, en linkedin, con cv/curriculum, en ficheros.
    - email: el email entre comillas, en pastebin/breaches, en filetypes.
    - dominio: site:dominio, ficheros expuestos, subdominios, paneles.
    - usuario: el alias en redes sociales y foros.

    `extra_domains` añade dorks `site:<dominio> "<target>"` para acotar la
    busqueda a dominios concretos, independientemente del tipo.

    Args:
        target: cadena objetivo (nombre, email, dominio o username).
        tipo: uno de "persona", "email", "dominio", "usuario". Cualquier
            otro valor cae al conjunto generico (solo la frase exacta).
        extra_domains: lista opcional de dominios para acotar via site:.

    Returns:
        lista de strings de dork en orden de generacion (sin deduplicar
        salvo el dork de frase exacta, que es la base comun).
    """
    q = f'"{target}"'  # frase exacta, base de casi todo dork
    dorks = [q]
    t = tipo.strip().lower()

    if t == "persona":
        dorks += [
            f"{q} filetype:pdf",
            f'site:linkedin.com/in {q}',
            f'site:twitter.com {q}',
            f'intext:{q} (curriculum OR cv OR resume)',
            f'{q} (email OR correo OR contacto)',
            f'{q} filetype:doc OR {q} filetype:docx',
        ]
    elif t == "email":
        dorks += [
            f'{q} site:pastebin.com',
            f'{q} (leak OR breach OR dump OR password)',
            f'{q} filetype:txt',
            f'{q} filetype:csv',
            f'{q} site:github.com',
        ]
    elif t == "dominio":
        dorks += [
            f'site:{target}',
            f'site:{target} filetype:pdf',
            f'site:{target} filetype:xlsx',
            f'site:{target} (login OR admin OR dashboard)',
            f'site:{target} intext:(password OR contraseña)',
            f'site:*.{target}',
            f'-www site:{target}',
        ]
    elif t == "usuario":
        dorks += [
            f'{q} site:github.com',
            f'{q} site:reddit.com',
            f'{q} (profile OR perfil OR user OR usuario)',
            f'inurl:{target}',
        ]
    # Cualquier otro tipo: solo la frase exacta (ya añadida).

    if extra_domains:
        for dom in extra_domains:
            dorks.append(f'site:{dom} {q}')

    return dorks
