#!/usr/bin/env python3
"""PX3 - Analise 14 dias Google Ads (READ ONLY). Bruno."""
import json
from google.ads.googleads.client import GoogleAdsClient

TOK = json.load(open('/opt/mia/config/google_ads_tokens.json'))
CID = "2186917336"
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): return ga.search(customer_id=CID, query=query)
def mi(v): return (v or 0)/1_000_000

print("#### 1. CAMPANHAS ATIVAS (LAST_14_DAYS, impressoes>0)")
rows = q("""
SELECT campaign.id, campaign.name, campaign.status, campaign.advertising_channel_type,
       campaign_budget.amount_micros, campaign.bidding_strategy_type,
       metrics.impressions, metrics.clicks, metrics.ctr, metrics.average_cpc,
       metrics.average_cpm, metrics.cost_micros, metrics.conversions,
       metrics.all_conversions, metrics.conversions_value, metrics.cost_per_conversion,
       metrics.search_impression_share, metrics.search_budget_lost_impression_share,
       metrics.search_rank_lost_impression_share
FROM campaign
WHERE segments.date DURING LAST_14_DAYS AND metrics.impressions > 0
ORDER BY metrics.cost_micros DESC
""")
for r in rows:
    c=r.campaign; m=r.metrics
    print(f"- [{c.id}] {c.name} | {c.advertising_channel_type.name} | {c.status.name} | bid={c.bidding_strategy_type.name} | budget/dia=R${mi(r.campaign_budget.amount_micros):.2f}")
    print(f"    impr={m.impressions} cliq={m.clicks} ctr={m.ctr*100:.2f}% cpc=R${mi(m.average_cpc):.2f} cpm=R${mi(m.average_cpm):.2f}")
    print(f"    CUSTO=R${mi(m.cost_micros):.2f} conv(biddable)={m.conversions:.1f} allconv={m.all_conversions:.1f} conv_value=R${m.conversions_value:.2f} CPA=R${mi(m.cost_per_conversion):.2f}")
    try:
        print(f"    IS={m.search_impression_share*100:.1f}% lost_budget={m.search_budget_lost_impression_share*100:.1f}% lost_rank={m.search_rank_lost_impression_share*100:.1f}%")
    except Exception: pass

print("\n#### 2. CONVERSOES POR ACAO (LAST_14_DAYS) - inclui Hotmart PURCHASE")
rows = q("""
SELECT segments.conversion_action_name, metrics.all_conversions, metrics.all_conversions_value
FROM customer
WHERE segments.date DURING LAST_14_DAYS
""")
agg={}
for r in rows:
    n=r.segments.conversion_action_name or "(sem nome)"
    agg.setdefault(n,[0.0,0.0])
    agg[n][0]+=r.metrics.all_conversions
    agg[n][1]+=r.metrics.all_conversions_value
for n,(c,v) in sorted(agg.items(), key=lambda x:-x[1][0]):
    print(f"- {n}: conv={c:.1f} value=R${v:.2f}")

print("\n#### 2b. Detalhe das conversion_action PURCHASE (config)")
rows = q("""
SELECT conversion_action.id, conversion_action.name, conversion_action.category,
       conversion_action.status, conversion_action.type,
       conversion_action.value_settings.default_value,
       conversion_action.primary_for_goal
FROM conversion_action
WHERE conversion_action.category = 'PURCHASE'
""")
for r in rows:
    ca=r.conversion_action
    print(f"- [{ca.id}] {ca.name} status={ca.status.name} type={ca.type_.name} default=R${ca.value_settings.default_value:.2f} primary={ca.primary_for_goal}")

print("\n#### 3. AD GROUPS (LAST_14_DAYS)")
rows = q("""
SELECT ad_group.name, ad_group.status, metrics.cost_micros, metrics.clicks,
       metrics.conversions, metrics.conversions_value, metrics.cost_per_conversion
FROM ad_group
WHERE segments.date DURING LAST_14_DAYS AND metrics.impressions > 0
ORDER BY metrics.cost_micros DESC
""")
for r in rows:
    ag=r.ad_group; m=r.metrics
    print(f"- {ag.name} [{ag.status.name}] custo=R${mi(m.cost_micros):.2f} cliq={m.clicks} conv={m.conversions:.1f} CPA=R${mi(m.cost_per_conversion):.2f} value=R${m.conversions_value:.2f}")

print("\n#### 4. KEYWORDS (LAST_14_DAYS) top gasto")
rows = q("""
SELECT ad_group_criterion.keyword.text, ad_group_criterion.keyword.match_type,
       ad_group.name, ad_group_criterion.status,
       metrics.cost_micros, metrics.clicks, metrics.conversions,
       metrics.cost_per_conversion, metrics.ctr
FROM keyword_view
WHERE segments.date DURING LAST_14_DAYS AND metrics.impressions > 0
ORDER BY metrics.cost_micros DESC
LIMIT 30
""")
for r in rows:
    k=r.ad_group_criterion.keyword; m=r.metrics
    print(f"- \"{k.text}\" [{k.match_type.name}] ({r.ad_group.name}) custo=R${mi(m.cost_micros):.2f} cliq={m.clicks} conv={m.conversions:.1f} CPA=R${mi(m.cost_per_conversion):.2f} ctr={m.ctr*100:.1f}%")

print("\n#### 5. SEARCH TERMS (LAST_14_DAYS) top gasto sem conversao")
rows = q("""
SELECT search_term_view.search_term, metrics.cost_micros, metrics.clicks,
       metrics.conversions, metrics.ctr
FROM search_term_view
WHERE segments.date DURING LAST_14_DAYS AND metrics.impressions > 0
ORDER BY metrics.cost_micros DESC
LIMIT 40
""")
for r in rows:
    st=r.search_term_view; m=r.metrics
    flag = "  <-- ZERO CONV" if (m.conversions or 0)==0 and mi(m.cost_micros)>5 else ""
    print(f"- \"{st.search_term}\" custo=R${mi(m.cost_micros):.2f} cliq={m.clicks} conv={m.conversions:.1f}{flag}")
