# -*- coding: utf-8 -*-
"""
Scraper ético de una tabla pública de Wikipedia -> CSV
=======================================================
Demo 1 del Arsenal Freelance.

Descarga una página pública de Wikipedia, localiza la primera tabla
(class="wikitable") y exporta todas sus filas a un archivo CSV.

Como ejemplo usa la lista de países por población (Naciones Unidas),
una página pública. El código es genérico: cambia la constante URL por
cualquier página con una tabla y funcionará igual.

Buenas prácticas éticas:
  - User-Agent identificable y honesto (Wikipedia lo pide).
  - Solo lee datos públicos; no envía nada ni usa credenciales.
  - Wikipedia permite este uso (contenido bajo licencia libre).
  - Si no hay internet, usa un conjunto de ejemplo incluido para que la
    demo SIEMPRE genere un CSV verificable (igual a sample_output.csv).

Uso:
    python scraper.py
"""

import csv
import sys

URL = "https://en.wikipedia.org/wiki/List_of_countries_by_population_(United_Nations)"
USER_AGENT = "ArsenalFreelance-DemoScraper/1.0 (educativo; contacto: meikimura2002@gmail.com)"
CSV_SALIDA = "reporte.csv"

# Encabezados del ejemplo (país, población, % del total mundial)
ENCABEZADOS = ["Pais", "Poblacion", "Porcentaje_mundial"]

# Datos de respaldo (si no hay internet). Coinciden con sample_output.csv
DATOS_RESPALDO = [
    ["India", "1428627663", "17.8%"],
    ["China", "1425671352", "17.8%"],
    ["Estados Unidos", "339996563", "4.2%"],
    ["Indonesia", "277534122", "3.5%"],
    ["Pakistan", "240485658", "3.0%"],
    ["Nigeria", "223804632", "2.8%"],
    ["Brasil", "216422446", "2.7%"],
    ["Bangladesh", "172954319", "2.2%"],
    ["Rusia", "144444359", "1.8%"],
    ["Mexico", "128455567", "1.6%"],
]


def scrape_en_vivo():
    """Descarga la página y extrae las filas de la primera wikitable. None si falla."""
    try:
        import requests
        from bs4 import BeautifulSoup
    except ImportError as e:
        print("[aviso] Falta una libreria (%s). Instala con: pip install -r requirements.txt" % e)
        return None

    try:
        resp = requests.get(URL, headers={"User-Agent": USER_AGENT}, timeout=15)
        resp.raise_for_status()
    except Exception as e:
        print("[aviso] No se pudo descargar (%s). Se usara el respaldo." % e)
        return None

    sopa = BeautifulSoup(resp.text, "html.parser")
    tabla = sopa.select_one("table.wikitable")
    if tabla is None:
        print("[aviso] No se encontro una tabla wikitable. Se usara el respaldo.")
        return None

    filas = []
    for tr in tabla.select("tr"):
        celdas = tr.find_all(["th", "td"])
        valores = [c.get_text(strip=True) for c in celdas]
        if valores:
            filas.append(valores)
    return filas if len(filas) > 1 else None


def guardar_csv(filas, ruta, encabezados=None):
    with open(ruta, "w", newline="", encoding="utf-8-sig") as f:
        w = csv.writer(f)
        if encabezados:
            w.writerow(encabezados)
        w.writerows(filas)


def main():
    print("=" * 60)
    print(" Scraper etico de tabla de Wikipedia -> CSV")
    print("=" * 60)

    filas = scrape_en_vivo()
    if filas is None:
        print("[info] Usando conjunto de ejemplo incluido (sin conexion).")
        guardar_csv(DATOS_RESPALDO, CSV_SALIDA, ENCABEZADOS)
        total = len(DATOS_RESPALDO)
        muestra = DATOS_RESPALDO
    else:
        print("[ok] Tabla extraida EN VIVO desde Wikipedia.")
        guardar_csv(filas, CSV_SALIDA)  # la primera fila ya son los encabezados reales
        total = len(filas) - 1
        muestra = filas[1:]

    print("-" * 60)
    print("Filas de datos guardadas: %d" % total)
    print("Archivo CSV generado:     %s" % CSV_SALIDA)
    print("-" * 60)
    print("Vista previa (primeras 3 filas de datos):")
    for fila in muestra[:3]:
        print("  " + " | ".join(fila[:3]))
    print("=" * 60)
    print("Listo. Abre reporte.csv en Excel o en cualquier hoja de calculo.")


if __name__ == "__main__":
    sys.exit(main())
