#!/usr/bin/env python3
"""
Prospecção ativa via Google Maps → CRM Linkia
Uso: python3 prospector.py --nicho "academia de ginástica" --cidade "São Paulo" --limite 50
"""

import argparse
import json
import time
import re
import requests
from playwright.sync_api import sync_playwright
from config import (
    LINKIA_TOKEN, LINKIA_LOCATION_ID,
    LINKIA_PIPELINE_ID, LINKIA_STAGE_ID
)

HEADERS = {
    "Authorization": f"Bearer {LINKIA_TOKEN}",
    "Content-Type": "application/json",
    "Version": "2021-07-28"
}


def scrape_google_maps(nicho: str, cidade: str, limite: int) -> list[dict]:
    """Scrapa empresas do Google Maps e retorna lista de leads."""
    leads = []
    query = f"{nicho} em {cidade}"

    with sync_playwright() as p:
        browser = p.chromium.launch(headless=True)
        page = browser.new_page()

        print(f"🔍 Buscando: {query}")
        page.goto(f"https://www.google.com/maps/search/{query.replace(' ', '+')}")
        page.wait_for_timeout(3000)

        # Scroll para carregar mais resultados
        for _ in range(min(limite // 5, 20)):
            try:
                panel = page.locator('div[role="feed"]').first
                panel.evaluate("el => el.scrollTop += 1500")
                page.wait_for_timeout(1500)
            except Exception:
                break

        # Coletar cards de resultado
        cards = page.locator('a[href*="/maps/place/"]').all()
        print(f"  Encontrados: {len(cards)} resultados")

        for card in cards[:limite]:
            try:
                card.click()
                page.wait_for_timeout(2000)

                lead = {}

                # Nome
                try:
                    lead["nome"] = page.locator('h1').first.inner_text(timeout=3000).strip()
                except Exception:
                    continue

                # Telefone
                try:
                    tel_el = page.locator('[data-item-id^="phone"]').first
                    lead["telefone"] = tel_el.get_attribute("data-item-id", timeout=2000)
                    lead["telefone"] = lead["telefone"].replace("phone:tel:", "").strip()
                except Exception:
                    lead["telefone"] = ""

                # Site
                try:
                    site_el = page.locator('[data-item-id="authority"]').first
                    lead["site"] = site_el.get_attribute("href", timeout=2000) or ""
                except Exception:
                    lead["site"] = ""

                # Endereço
                try:
                    addr_el = page.locator('[data-item-id^="address"]').first
                    lead["endereco"] = addr_el.inner_text(timeout=2000).strip()
                except Exception:
                    lead["endereco"] = ""

                # Avaliação
                try:
                    rating_el = page.locator('span[aria-hidden="true"]').first
                    lead["avaliacao"] = rating_el.inner_text(timeout=1000).strip()
                except Exception:
                    lead["avaliacao"] = ""

                lead["nicho"] = nicho
                lead["cidade"] = cidade

                if lead.get("nome"):
                    leads.append(lead)
                    print(f"  ✅ {lead['nome']} | {lead['telefone'] or 'sem tel'}")

            except Exception as e:
                print(f"  ⚠️ Erro ao coletar lead: {e}")
                continue

        browser.close()

    return leads


def criar_contato_linkia(lead: dict) -> str | None:
    """Cria contato no CRM Linkia e retorna o contact ID."""
    nome_split = lead["nome"].split(" ", 1)
    primeiro = nome_split[0]
    sobrenome = nome_split[1] if len(nome_split) > 1 else ""

    telefone = re.sub(r"[^\d+]", "", lead.get("telefone", ""))

    payload = {
        "locationId": LINKIA_LOCATION_ID,
        "firstName": primeiro,
        "lastName": sobrenome,
        "companyName": lead["nome"],
        "phone": telefone or None,
        "website": lead.get("site") or None,
        "address1": lead.get("endereco") or None,
        "tags": ["prospeccao-ativa", lead.get("nicho", ""), lead.get("cidade", "")],
        "source": "Google Maps",
        "customFields": [
            {"key": "avaliacao_google", "field_value": lead.get("avaliacao", "")},
        ]
    }

    payload = {k: v for k, v in payload.items() if v is not None}

    r = requests.post(
        "https://services.leadconnectorhq.com/contacts/",
        headers=HEADERS,
        json=payload
    )

    if r.status_code in (200, 201):
        contact_id = r.json().get("contact", {}).get("id")
        print(f"  👤 Contato criado: {lead['nome']} ({contact_id})")
        return contact_id
    else:
        print(f"  ❌ Erro ao criar contato: {r.status_code} - {r.text[:200]}")
        return None


def criar_oportunidade_linkia(lead: dict, contact_id: str) -> bool:
    """Cria oportunidade no pipeline Prospecção Ativa."""
    payload = {
        "pipelineId": LINKIA_PIPELINE_ID,
        "locationId": LINKIA_LOCATION_ID,
        "name": lead["nome"],
        "pipelineStageId": LINKIA_STAGE_ID,
        "status": "open",
        "contactId": contact_id,
        "source": "Google Maps",
    }

    r = requests.post(
        "https://services.leadconnectorhq.com/opportunities/",
        headers=HEADERS,
        json=payload
    )

    if r.status_code in (200, 201):
        print(f"  🎯 Oportunidade criada no pipeline")
        return True
    else:
        print(f"  ❌ Erro na oportunidade: {r.status_code} - {r.text[:200]}")
        return False


def main():
    parser = argparse.ArgumentParser(description="Prospecção Google Maps → Linkia CRM")
    parser.add_argument("--nicho", required=True, help='Ex: "clínica odontológica"')
    parser.add_argument("--cidade", required=True, help='Ex: "São Paulo"')
    parser.add_argument("--limite", type=int, default=20, help="Máximo de leads (padrão: 20)")
    args = parser.parse_args()

    print(f"\n🚀 Iniciando prospecção: {args.nicho} em {args.cidade} (limite: {args.limite})\n")

    leads = scrape_google_maps(args.nicho, args.cidade, args.limite)

    if not leads:
        print("Nenhum lead encontrado.")
        return

    print(f"\n📋 {len(leads)} leads encontrados. Enviando para o CRM...\n")

    ok = 0
    for lead in leads:
        contact_id = criar_contato_linkia(lead)
        if contact_id:
            criar_oportunidade_linkia(lead, contact_id)
            ok += 1
        time.sleep(0.5)

    # Salvar relatório local
    relatorio = f"/opt/mia/workspace/prospeccao_ativa/leads_{args.cidade.replace(' ', '_')}_{args.nicho.replace(' ', '_')}.json"
    with open(relatorio, "w", encoding="utf-8") as f:
        json.dump(leads, f, ensure_ascii=False, indent=2)

    print(f"\n✅ Concluído: {ok}/{len(leads)} leads enviados ao CRM Linkia")
    print(f"📁 Relatório salvo em: {relatorio}")


if __name__ == "__main__":
    main()
