#!/usr/bin/env python3
import requests
import json
import csv
import time
from pathlib import Path

# Configurazioni
OUTPUT_CSV = Path("/home/ubuntu/GhostAgency/leads_seed_parma_provincia.csv")
CITIES = ["Parma", "Medesano", "Felegara", "Noceto"]
CATEGORIES = [
    "Ristorante", "Pizzeria", "Bar", "Caffetteria", "Dentista", 
    "Idraulico", "Elettricista", "Parrucchiere", "Farmacia", "Centro Estetico",
    "Autofficina", "Panificio", "Macelleria", "Gelateria", "Fiorista"
]

HEADERS = {
    "User-Agent": "GhostAgency Radar/3.0 (admin@svoraj.me) - Nominatim Fetcher"
}

def fetch_category(category, city):
    print(f"[*] Cerco '{category}' a {city}...")
    url = f"https://nominatim.openstreetmap.org/search"
    params = {
        "q": f"{category} {city}",
        "format": "json",
        "addressdetails": 1,
        "extratags": 1,
        "limit": 50  # Max consentito da Nominatim
    }
    
    try:
        response = requests.get(url, headers=HEADERS, params=params, timeout=15)
        if response.status_code == 200:
            return response.json()
        else:
            print(f"    [!] Errore API: {response.status_code}")
    except Exception as e:
        print(f"    [!] Errore di rete: {e}")
    return []

def main():
    print(f"=========================================================")
    print(f" GHOST AGENCY - SCRAPER NOMINATIM OFFLINE BYPASS")
    print(f" Generazione del database reale (Parma e Provincia)")
    print(f"=========================================================\n")
    
    all_leads = []
    
    for city in CITIES:
        for cat in CATEGORIES:
            results = fetch_category(cat, city)
            for r in results:
                # Estraiamo i dati utili
                name = r.get("name", "")
                if not name:
                    # Usa il display name se il nome è vuoto
                    name = r.get("display_name", "").split(",")[0]
                
                # Non includiamo i risultati troppo generici
                if name.lower() == cat.lower():
                    continue
                    
                address_obj = r.get("address", {})
                street = address_obj.get("road", "")
                house = address_obj.get("house_number", "")
                address = f"{street} {house}, {city}".strip(" ,")
                
                # Estrai il telefono se disponibile nei tag aggiuntivi
                tags = r.get("extratags") or {}
                phone = tags.get("phone", tags.get("contact:phone", ""))
                
                # Mettiamo da parte solo se abbiamo un nome sensato
                if name and len(name) > 3:
                    all_leads.append({
                        "nome": name,
                        "telefono": phone,
                        "indirizzo": address,
                        "categoria": cat,
                        "citta": city
                    })
            
            # Policy di Nominatim: 1 richiesta al secondo massimo
            time.sleep(1.5)
        
    # Rimuoviamo i duplicati basandoci sul nome e città
    unique_leads = {f'{lead["nome"]}_{lead["citta"]}': lead for lead in all_leads}.values()
    
    print(f"\n[+] Raccolta terminata. Trovate {len(unique_leads)} attività reali totali.")
    
    fieldnames = ["nome", "telefono", "indirizzo", "categoria", "citta"]
    with open(OUTPUT_CSV, "w", newline="", encoding="utf-8") as f:
        writer = csv.DictWriter(f, fieldnames=fieldnames)
        writer.writeheader()
        writer.writerows(unique_leads)
        
    print(f"[+] Dati salvati in: {OUTPUT_CSV}")
    print("[+] Il Radar ora può iniziare l'analisi DNS sui target reali!")

if __name__ == "__main__":
    main()
