from playwright.sync_api import sync_playwright
import csv
import time
import socket

def check_dns(name, city):
    """Metodo Ingegneristico: Indovina il dominio tramite DNS"""
    clean_name = "".join(c for c in name if c.isalnum()).lower()
    city_clean = city.lower()
    domains_to_test = [
        f"{clean_name}.it", f"{clean_name}.com", 
        f"{clean_name}{city_clean}.it", f"{clean_name}{city_clean}.com"
    ]
    for domain in domains_to_test:
        try:
            socket.gethostbyname(domain)
            print(f"    [-] SCARTATO (DNS): Il dominio {domain} esiste. Hanno un sito.")
            return True
        except socket.gaierror:
            pass
    return False

def verify_with_playwright_ddg(page, name, city):
    """Metodo Finto Umano: Cerca su DuckDuckGo tramite browser Headless"""
    query = f"{name} {city} sito ufficiale"
    # Usiamo la versione HTML di DDG che è leggerissima e non ha script di blocco
    url = f"https://html.duckduckgo.com/html/?q={query.replace(' ', '+')}"
    
    try:
        page.goto(url, timeout=15000)
        # Estrai tutti i link dei risultati
        links = page.evaluate('''() => {
            return Array.from(document.querySelectorAll('.result__url')).map(e => e.innerText.trim().toLowerCase());
        }''')
        
        for link in links:
            # Ignoriamo i social
            if any(x in link for x in ['facebook.', 'tripadvisor.', 'thefork.', 'instagram.', 'paginegialle.', 'sluurpy.', 'restaurantguru.']):
                continue
            if '.it' in link or '.com' in link:
                print(f"    [-] SCARTATO (DDG): Trovato probabile sito web -> {link}")
                return True
                
    except Exception as e:
        print(f"    [!] Errore DDG per {name}. (Salto per sicurezza)")
        return True 
        
    return False

def run_ultimate_radar(city, category):
    print(f"=================================================================")
    print(f" GHOST AGENCY - RADAR ULTIMATE (PagineGialle + DNS + DDG Headless)")
    print(f" Ricerca di '{category}' a '{city}'")
    print(f"=================================================================\n")
    
    leads = []
    
    with sync_playwright() as p:
        browser = p.chromium.launch(headless=True)
        # Usiamo un User-Agent realistico per non farci bloccare da PagineGialle
        context = browser.new_context(user_agent="Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36")
        page = context.new_page()
        
        # 1. SCRAPING PAGINE GIALLE
        url = f"https://www.paginegialle.it/ricerca/{category}/{city}"
        print(f"[*] 1. Infiltrazione su PagineGialle ({url})...")
        
        try:
            page.goto(url, timeout=30000)
            time.sleep(4) # Aspetta che i bot-protection si calmino
            
            # PagineGialle mostra i risultati dentro degli article
            items = page.query_selector_all('article.search-item, div.search-item')
            
            if not items:
                print("[-] PagineGialle ha bloccato la richiesta o nessun risultato trovato. Passo al file OSM locale per il test.")
                # Fallback: usiamo la vecchia lista CSV per dimostrare i layer di validazione
                try:
                    with open("leads_restaurant_parma.csv", 'r') as f:
                        fallback_leads = list(csv.DictReader(f))
                        for lead in fallback_leads:
                            print(f"\n[*] Analisi Bersaglio: {lead['Nome']}")
                            if not check_dns(lead['Nome'], city):
                                if not verify_with_playwright_ddg(page, lead['Nome'], city):
                                    print(f"    [+] BERSAGLIO CONFERMATO: {lead['Nome']} è totalmente privo di sito web.")
                                    leads.append(lead)
                except:
                    pass
            else:
                for item in items:
                    name_el = item.query_selector('h2')
                    if not name_el: continue
                    name = name_el.inner_text().strip()
                    
                    print(f"\n[*] Analisi Bersaglio: {name}")
                    
                    # Controllo se c'è il bottone del sito web su PagineGialle
                    website_btn = item.query_selector('a.website, a[data-omniclick*="Sito"]')
                    if website_btn:
                        print("    [-] SCARTATO (PagineGialle): Ha il bottone Sito Web.")
                        continue
                        
                    # Estrai telefono
                    phone_el = item.query_selector('.tel, a[href^="tel:"]')
                    phone = phone_el.inner_text().strip() if phone_el else "N/A"
                    
                    # 2. VALIDAZIONE DNS BRUTEFORCE
                    if check_dns(name, city):
                        continue
                        
                    # 3. VALIDAZIONE HEADLESS SU DUCKDUCKGO
                    if verify_with_playwright_ddg(page, name, city):
                        continue
                        
                    print(f"    [+] BERSAGLIO CONFERMATO: {name} ha fallito tutti i test di presenza digitale.")
                    leads.append({
                        'Nome': name,
                        'Telefono': phone,
                        'Indirizzo': "Da PagineGialle",
                        'Categoria': category
                    })
                    
        except Exception as e:
            print(f"[!] Errore Critico Scraper: {e}")
            
        browser.close()
        
    # SALVATAGGIO
    if leads:
        filename = f"leads_{category}_{city}_ultimate.csv"
        keys = leads[0].keys()
        with open(filename, 'w', newline='', encoding='utf-8') as output_file:
            dict_writer = csv.DictWriter(output_file, fieldnames=keys)
            dict_writer.writeheader()
            dict_writer.writerows(leads)
        print(f"\n[+] VITTORIA TOTALE. Salvati {len(leads)} bersagli infallibili in {filename}.")
    else:
        print("\n[-] Nessun bersaglio è sopravvissuto ai 3 layer di validazione (PagineGialle + DNS + Motori di Ricerca).")

if __name__ == "__main__":
    run_ultimate_radar("Parma", "dentisti")
