#!/usr/bin/env python3
"""RIBEIROS - Report completo Google Ads (READ ONLY) - 30d + 7d."""
import json
from google.ads.googleads.client import GoogleAdsClient

TOK = json.load(open('/opt/mia/config/google_ads_tokens.json'))
CUSTOMER_ID = open('/opt/mia/config/google_ads_ribeiros_customer_id.txt').read().strip()

cfg = {
    "developer_token": TOK["developer_token"],
    "client_id": TOK["client_id"],
    "client_secret": TOK["client_secret"],
    "refresh_token": TOK["refresh_token"],
    "login_customer_id": TOK["mcc_id"],
    "use_proto_plus": True,
}
client = GoogleAdsClient.load_from_dict(cfg)
ga = client.get_service("GoogleAdsService")

def q(query):
    try:
        return list(ga.search(customer_id=CUSTOMER_ID, query=query)), None
    except Exception as e:
        return None, str(e)

def micros(v): return (v or 0) / 1_000_000

def pct(v): return (v or 0) * 100

print("#"*72)
print("# 1. CAMPANHAS - agregado 30d e 7d")
print("#"*72)
for period in ["LAST_30_DAYS", "LAST_7_DAYS"]:
    print(f"\n===== {period} =====")
    rows, err = q(f"""
    SELECT campaign.id, campaign.name, campaign.status,
           campaign_budget.amount_micros,
           metrics.impressions, metrics.clicks, metrics.ctr, metrics.average_cpc,
           metrics.cost_micros, metrics.conversions, metrics.all_conversions,
           metrics.cost_per_conversion, metrics.conversions_from_interactions_rate,
           metrics.search_impression_share,
           metrics.search_budget_lost_impression_share,
           metrics.search_rank_lost_impression_share
    FROM campaign
    WHERE campaign.status = 'ENABLED' AND segments.date DURING {period}
    ORDER BY metrics.cost_micros DESC
    """)
    if err:
        print("ERRO:", err[:500]); continue
    for r in rows:
        c = r.campaign; m = r.metrics
        print(f"\n[{c.id}] {c.name}")
        print(f"  budget/dia=R${micros(r.campaign_budget.amount_micros):.2f}  status={c.status.name}")
        print(f"  impr={m.impressions} cliq={m.clicks} ctr={pct(m.ctr):.2f}% "
              f"cpc=R${micros(m.average_cpc):.2f} custo=R${micros(m.cost_micros):.2f}")
        print(f"  conv={m.conversions:.1f} allconv={m.all_conversions:.1f} "
              f"cpa=R${micros(m.cost_per_conversion):.2f} taxaConv={pct(m.conversions_from_interactions_rate):.2f}%")
        print(f"  IS={pct(m.search_impression_share):.1f}% "
              f"lostBudget={pct(m.search_budget_lost_impression_share):.1f}% "
              f"lostRank={pct(m.search_rank_lost_impression_share):.1f}%")

print("\n"+"#"*72)
print("# 2. ACOES DE CONVERSAO PRIMARIAS")
print("#"*72)
rows, err = q("""
SELECT conversion_action.id, conversion_action.name, conversion_action.status,
       conversion_action.type, conversion_action.primary_for_goal
FROM conversion_action
WHERE conversion_action.status = 'ENABLED'
""")
if err: print("ERRO:", err[:500])
else:
    for r in rows:
        ca = r.conversion_action
        print(f"  id={ca.id} primary={ca.primary_for_goal} name={ca.name} type={ca.type_.name}")

print("\n"+"#"*72)
print("# 3. CONVERSOES POR CAMPANHA x ACAO (30d) - so as que tem conv")
print("#"*72)
rows, err = q("""
SELECT campaign.name, segments.conversion_action_name,
       metrics.conversions, metrics.all_conversions
FROM campaign
WHERE segments.date DURING LAST_30_DAYS AND metrics.all_conversions > 0
""")
if err: print("ERRO:", err[:500])
elif not rows: print("  NENHUMA conversao em 30d (via segments).")
else:
    for r in rows:
        print(f"  {r.campaign.name[:35]} | {r.segments.conversion_action_name} | "
              f"conv={r.metrics.conversions:.1f} allconv={r.metrics.all_conversions:.1f}")

print("\n"+"#"*72)
print("# 4. TOP KEYWORDS por CUSTO (30d)")
print("#"*72)
rows, err = q("""
SELECT campaign.name, ad_group_criterion.keyword.text,
       ad_group_criterion.keyword.match_type,
       metrics.cost_micros, metrics.clicks, metrics.impressions,
       metrics.conversions, metrics.cost_per_conversion,
       ad_group_criterion.quality_info.quality_score
FROM keyword_view
WHERE segments.date DURING LAST_30_DAYS AND metrics.impressions > 0
ORDER BY metrics.cost_micros DESC
LIMIT 25
""")
if err: print("ERRO:", err[:500])
else:
    print(f"  {'custo':>8}{'cliq':>5}{'conv':>5}{'QS':>4}  kw (match) | campanha")
    for r in rows:
        k = r.ad_group_criterion; m = r.metrics
        qs = k.quality_info.quality_score if k.quality_info.quality_score else "-"
        print(f"  R${micros(m.cost_micros):>6.2f}{m.clicks:>5}{m.conversions:>5.0f}{str(qs):>4}  "
              f"{k.keyword.text} ({k.keyword.match_type.name}) | {r.campaign.name[:20]}")

print("\n"+"#"*72)
print("# 5. TOP KEYWORDS por CONVERSAO (30d)")
print("#"*72)
rows, err = q("""
SELECT campaign.name, ad_group_criterion.keyword.text,
       metrics.conversions, metrics.cost_micros, metrics.cost_per_conversion
FROM keyword_view
WHERE segments.date DURING LAST_30_DAYS AND metrics.conversions > 0
ORDER BY metrics.conversions DESC
LIMIT 10
""")
if err: print("ERRO:", err[:500])
elif not rows: print("  NENHUMA keyword converteu em 30d.")
else:
    for r in rows:
        print(f"  conv={r.metrics.conversions:.1f} cpa=R${micros(r.metrics.cost_per_conversion):.2f} "
              f"custo=R${micros(r.metrics.cost_micros):.2f} | {r.ad_group_criterion.keyword.text} | {r.campaign.name[:20]}")

print("\n"+"#"*72)
print("# 6. SEARCH TERMS - top custo sem conversao (30d) => candidatos a negativa")
print("#"*72)
rows, err = q("""
SELECT campaign.name, search_term_view.search_term,
       metrics.cost_micros, metrics.clicks, metrics.conversions, metrics.impressions
FROM search_term_view
WHERE segments.date DURING LAST_30_DAYS AND metrics.clicks > 0
ORDER BY metrics.cost_micros DESC
LIMIT 30
""")
if err: print("ERRO:", err[:500])
else:
    for r in rows:
        m = r.metrics
        flag = "  <<SEM CONV" if m.conversions == 0 and m.clicks >= 2 else ""
        print(f"  R${micros(m.cost_micros):>6.2f} cliq={m.clicks} conv={m.conversions:.0f} | "
              f"{r.search_term_view.search_term} | {r.campaign.name[:18]}{flag}")

print("\n"+"#"*72)
print("# 7. ADS (RSA) - final_urls e status")
print("#"*72)
rows, err = q("""
SELECT campaign.name, ad_group.name, ad_group_ad.ad.type,
       ad_group_ad.status, ad_group_ad.ad.final_urls,
       metrics.impressions, metrics.clicks, metrics.conversions
FROM ad_group_ad
WHERE campaign.status='ENABLED' AND segments.date DURING LAST_30_DAYS
ORDER BY metrics.impressions DESC
""")
if err: print("ERRO:", err[:500])
else:
    for r in rows:
        a = r.ad_group_ad
        urls = list(a.ad.final_urls) if a.ad.final_urls else []
        print(f"  [{a.ad.type_.name}] {a.status.name} impr={r.metrics.impressions} "
              f"cliq={r.metrics.clicks} conv={r.metrics.conversions:.0f} | {r.campaign.name[:22]}")
        for u in urls:
            print(f"      URL: {u}")

print("\n"+"#"*72)
print("# 8. QUALITY SCORE medio por campanha (30d)")
print("#"*72)
rows, err = q("""
SELECT campaign.name, ad_group_criterion.quality_info.quality_score
FROM keyword_view
WHERE segments.date DURING LAST_30_DAYS AND metrics.impressions > 0
""")
if err: print("ERRO:", err[:500])
else:
    agg = {}
    for r in rows:
        qs = r.ad_group_criterion.quality_info.quality_score
        if qs:
            agg.setdefault(r.campaign.name, []).append(qs)
    for name, lst in agg.items():
        print(f"  {name[:40]}: QS medio={sum(lst)/len(lst):.1f} (n={len(lst)})")

print("\nDONE.")
