#!/usr/bin/env python3
"""
Ghost Agency Lead Finder - usa Overpass API (OpenStreetMap) per trovare attività locali.
Poi filtra quelle che NON hanno website usando controlli multipli.
Output: leads_raw.csv
"""
import csv, re, time, sys
from pathlib import Path
import urllib.request
import json

SEARCH_QUERIES = [
    ("ristorante", "restaurant"),
    ("dentista", "dentist"),
    ("palestra", "gym"),
    ("parrucchiere", "hairdresser"),
    ("avvocato", "lawyer"),
    ("idraulico", "plumber"),
    ("estetista", "beautician"),
]
MAX_PER_QUERY = 30
OUTPUT_CSV = "leads_raw.csv"
OVERPASS_URL = "https://overpass-api.de/api/interpreter"

OVERPASS_QUERY_TEMPLATE = """
[out:json][timeout:60];
area[name="Parma"]->.searchArea;
(
  node["amenity"="{amenity}"](area.searchArea);
  way["amenity"="{amenity}"](area.searchArea);
  relation["amenity"="{amenity}"](area.searchArea);
);
out center tags;
"""

def slugify(s: str) -> str:
    return re.sub(r"[^a-z0-9]+", "-", s.lower()).strip("-")

def fetch_overpass(amenity: str):
    query = OVERPASS_QUERY_TEMPLATE.format(amenity=amenity)
    req = urllib.request.Request(
        OVERPASS_URL,
        data=query.encode('utf-8'),
        headers={"User-Agent": "GhostAgency/1.0 (contact: admin@svoraj.it)"}
    )
    try:
        with urllib.request.urlopen(req, timeout=60) as resp:
            return json.loads(resp.read().decode('utf-8'))
    except Exception as e:
        print(f"  Overpass error for {amenity}: {e}")
        return None

def has_website(tags: dict) -> bool:
    """Controlla se l'attività ha un sito web nei tag OSM"""
    website_fields = ['website', 'contact:website', 'url']
    for field in website_fields:
        if tags.get(field):
            return True
    return False

def extract_leads_from_osm():
    leads = []
    seen = set()
    
    for category_it, amenity in SEARCH_QUERIES:
        print(f"\n=== Query: {category_it} ({amenity}) ===")
        data = fetch_overpass(amenity)
        if not data or 'elements' not in data:
            continue
        
        count = 0
        for elem in data['elements']:
            if count >= MAX_PER_QUERY:
                break
            
            tags = elem.get('tags', {})
            name = tags.get('name', '')
            if not name or name in seen:
                continue
            
            # Filtra: deve avere telefono ma NON website
            phone = tags.get('phone') or tags.get('contact:phone', '')
            if not phone:
                continue
            
            if has_website(tags):
                print(f"  SKIP (has website): {name}")
                continue
            
            seen.add(name)
            
            # Estrae indirizzo
            addr_parts = []
            for k in ['addr:street', 'addr:housenumber', 'addr:city', 'addr:postcode']:
                if tags.get(k):
                    addr_parts.append(tags[k])
            address = ", ".join(addr_parts)
            
            # Email (raro in OSM)
            email = tags.get('email') or tags.get('contact:email', '')
            
            # Coordinate
            lat = elem.get('lat') or (elem.get('center', {}).get('lat') if 'center' in elem else '')
            lon = elem.get('lon') or (elem.get('center', {}).get('lon') if 'center' in elem else '')
            
            maps_url = f"https://www.google.com/maps/search/?api=1&query={lat},{lon}" if lat and lon else ""
            
            lead = {
                "name": name,
                "category": category_it,
                "address": address,
                "phone": phone,
                "email": email,
                "website": "",
                "rating": "",
                "reviews": "",
                "query": category_it,
                "maps_url": maps_url
            }
            leads.append(lead)
            count += 1
            print(f"  FOUND (no website): {name} | {phone} | {address[:50]}")
            time.sleep(0.1)
    
    return leads

def write_csv(leads):
    fieldnames = ["name", "category", "address", "phone", "email", "website", "rating", "reviews", "query", "maps_url"]
    with open(OUTPUT_CSV, "w", newline="", encoding="utf-8") as f:
        writer = csv.DictWriter(f, fieldnames=fieldnames)
        writer.writeheader()
        writer.writerows(leads)
    print(f"\n✅ Saved {len(leads)} leads to {OUTPUT_CSV}")

def main():
    print("=" * 60)
    print("Ghost Agency Lead Finder - OpenStreetMap/Overpass")
    print("=" * 60)
    leads = extract_leads_from_osm()
    write_csv(leads)

if __name__ == "__main__":
    main()
