#!/usr/bin/env python3
"""
GTM Comprehensive Tracking Setup for px3lab.com.br
Container: GTM-58JZ7RBL | Account: 6297533940 | Container: 221378243 | WS: 2
"""
import json, requests, sys

with open("/opt/mia/config/gtm_tokens.json") as f:
    tok = json.load(f)

ACCESS = tok["access_token"]
ACCOUNT_ID = "6297533940"
CONTAINER_ID = "221378243"
WS_ID = "3"  # Default Workspace (id=2 was old submitted workspace)
GA4_ID = "G-TY3MLTL2QD"
BASE = f"https://www.googleapis.com/tagmanager/v2/accounts/{ACCOUNT_ID}/containers/{CONTAINER_ID}/workspaces/{WS_ID}"
HEADERS = {"Authorization": f"Bearer {ACCESS}", "Content-Type": "application/json"}

errors = []
created = []

def post(path, body):
    url = BASE + path if not path.startswith("http") else path
    r = requests.post(url, headers=HEADERS, json=body)
    return r

def get(path):
    url = BASE + path if not path.startswith("http") else path
    r = requests.get(url, headers=HEADERS)
    return r

def step(name, fn):
    print(f"\n--- {name} ---")
    try:
        result = fn()
        if result is None:
            print(f"  OK (skipped)")
            return None
        if hasattr(result, 'status_code'):
            if result.status_code in (200, 201):
                data = result.json()
                print(f"  OK {result.status_code}")
                created.append(name)
                return data
            else:
                print(f"  ERRO {result.status_code}: {result.text[:300]}")
                errors.append(f"{name}: {result.status_code} - {result.text[:200]}")
                return None
        return result
    except Exception as e:
        print(f"  EXCEPTION: {e}")
        errors.append(f"{name}: exception {e}")
        return None

# ------------------------------------------------------------------
# 1. Enable built-in variables (scroll depth, form, page vars)
# ------------------------------------------------------------------
VARS_TO_ENABLE = [
    "scrollDepthThreshold",
    "scrollDepthUnits",
    "scrollDepthDirection",
    "formElement",
    "formClasses",
    "formId",
    "formTarget",
    "formUrl",
    "formText",
    "pageUrl",
    "pageHostname",
    "pagePath",
]

def enable_builtins():
    # GTM API: POST built_in_variables?type=X&type=Y
    qs = "&".join(f"type={v}" for v in VARS_TO_ENABLE)
    url = f"{BASE}/built_in_variables?{qs}"
    r = requests.post(url, headers=HEADERS, json={})
    return r

step("Enable Built-in Variables", enable_builtins)

# ------------------------------------------------------------------
# 2. Scroll Depth Trigger (25, 50, 75, 90%)
# ------------------------------------------------------------------
def create_scroll_trigger():
    body = {
        "name": "Scroll Depth - 25 50 75 90%",
        "type": "scrollDepth",
        "parameter": [
            {"type": "BOOLEAN", "key": "verticalThresholdUnits", "value": "true"},
            {
                "type": "LIST",
                "key": "verticalThresholds",
                "list": [
                    {"type": "TEMPLATE", "value": "25"},
                    {"type": "TEMPLATE", "value": "50"},
                    {"type": "TEMPLATE", "value": "75"},
                    {"type": "TEMPLATE", "value": "90"},
                ]
            }
        ]
    }
    r = post("/triggers", body)
    return r

scroll_trigger = step("Scroll Depth Trigger", create_scroll_trigger)
scroll_trigger_id = scroll_trigger.get("triggerId") if scroll_trigger else None
print(f"  scroll trigger id: {scroll_trigger_id}")

# ------------------------------------------------------------------
# 3. Outbound Click Trigger
# ------------------------------------------------------------------
def create_outbound_trigger():
    body = {
        "name": "Outbound Click",
        "type": "LINK_CLICK",
        "parameter": [
            {"type": "BOOLEAN", "key": "waitForTags", "value": "false"},
            {"type": "BOOLEAN", "key": "checkValidation", "value": "false"},
        ],
        "filter": [
            {
                "type": "CONTAINS",
                "negate": True,
                "parameter": [
                    {"type": "TEMPLATE", "key": "arg0", "value": "{{Click URL}}"},
                    {"type": "TEMPLATE", "key": "arg1", "value": "{{Page Hostname}}"},
                ]
            }
        ]
    }
    r = post("/triggers", body)
    return r

outbound_trigger = step("Outbound Click Trigger", create_outbound_trigger)
outbound_trigger_id = outbound_trigger.get("triggerId") if outbound_trigger else None
print(f"  outbound trigger id: {outbound_trigger_id}")

# ------------------------------------------------------------------
# 4. Form Submit Trigger
# ------------------------------------------------------------------
def create_form_trigger():
    body = {
        "name": "Form Submit - All Forms",
        "type": "FORM_SUBMISSION",
        "parameter": [
            {"type": "BOOLEAN", "key": "waitForTags", "value": "false"},
            {"type": "BOOLEAN", "key": "checkValidation", "value": "false"},
        ]
    }
    r = post("/triggers", body)
    return r

form_trigger = step("Form Submit Trigger", create_form_trigger)
form_trigger_id = form_trigger.get("triggerId") if form_trigger else None
print(f"  form trigger id: {form_trigger_id}")

# ------------------------------------------------------------------
# 5. GA4 page_view event tag (fires on All Pages)
# ------------------------------------------------------------------
def create_pageview_tag():
    body = {
        "name": "GA4 - Event page_view",
        "type": "gaawe",
        "parameter": [
            {"type": "TEMPLATE", "key": "measurementIdOverride", "value": GA4_ID},
            {"type": "TEMPLATE", "key": "eventName", "value": "page_view"},
        ],
        "firingTriggerId": ["3"]  # All Pages trigger
    }
    r = post("/tags", body)
    return r

step("GA4 page_view Tag", create_pageview_tag)

# ------------------------------------------------------------------
# 6. GA4 scroll_depth event tag
# ------------------------------------------------------------------
def create_scroll_tag():
    if not scroll_trigger_id:
        print("  Pulando - sem scroll trigger")
        return None
    body = {
        "name": "GA4 - Event scroll",
        "type": "gaawe",
        "parameter": [
            {"type": "TEMPLATE", "key": "measurementIdOverride", "value": GA4_ID},
            {"type": "TEMPLATE", "key": "eventName", "value": "scroll"},
            {
                "type": "LIST",
                "key": "eventParameters",
                "list": [
                    {
                        "type": "MAP",
                        "map": [
                            {"type": "TEMPLATE", "key": "name", "value": "percent_scrolled"},
                            {"type": "TEMPLATE", "key": "value", "value": "{{Scroll Depth Threshold}}"},
                        ]
                    }
                ]
            }
        ],
        "firingTriggerId": [str(scroll_trigger_id)]
    }
    r = post("/tags", body)
    return r

step("GA4 scroll Tag", create_scroll_tag)

# ------------------------------------------------------------------
# 7. GA4 outbound click tag
# ------------------------------------------------------------------
def create_outbound_tag():
    if not outbound_trigger_id:
        print("  Pulando - sem outbound trigger")
        return None
    body = {
        "name": "GA4 - Event outbound_click",
        "type": "gaawe",
        "parameter": [
            {"type": "TEMPLATE", "key": "measurementIdOverride", "value": GA4_ID},
            {"type": "TEMPLATE", "key": "eventName", "value": "click"},
            {
                "type": "LIST",
                "key": "eventParameters",
                "list": [
                    {
                        "type": "MAP",
                        "map": [
                            {"type": "TEMPLATE", "key": "name", "value": "outbound"},
                            {"type": "TEMPLATE", "key": "value", "value": "true"},
                        ]
                    },
                    {
                        "type": "MAP",
                        "map": [
                            {"type": "TEMPLATE", "key": "name", "value": "link_url"},
                            {"type": "TEMPLATE", "key": "value", "value": "{{Click URL}}"},
                        ]
                    }
                ]
            }
        ],
        "firingTriggerId": [str(outbound_trigger_id)]
    }
    r = post("/tags", body)
    return r

step("GA4 outbound_click Tag", create_outbound_tag)

# ------------------------------------------------------------------
# 8. GA4 form_submit tag
# ------------------------------------------------------------------
def create_form_tag():
    if not form_trigger_id:
        print("  Pulando - sem form trigger")
        return None
    body = {
        "name": "GA4 - Event form_submit",
        "type": "gaawe",
        "parameter": [
            {"type": "TEMPLATE", "key": "measurementIdOverride", "value": GA4_ID},
            {"type": "TEMPLATE", "key": "eventName", "value": "form_submit"},
            {
                "type": "LIST",
                "key": "eventParameters",
                "list": [
                    {
                        "type": "MAP",
                        "map": [
                            {"type": "TEMPLATE", "key": "name", "value": "form_id"},
                            {"type": "TEMPLATE", "key": "value", "value": "{{Form ID}}"},
                        ]
                    }
                ]
            }
        ],
        "firingTriggerId": [str(form_trigger_id)]
    }
    r = post("/tags", body)
    return r

step("GA4 form_submit Tag", create_form_tag)

# ------------------------------------------------------------------
# 9. Create new version
# ------------------------------------------------------------------
def create_version():
    url = f"https://www.googleapis.com/tagmanager/v2/accounts/{ACCOUNT_ID}/containers/{CONTAINER_ID}/workspaces/3:create_version"
    body = {
        "name": "v2 - Comprehensive GA4 Tracking",
        "notes": "Adicionado: page_view, scroll_depth, outbound_click, form_submit"
    }
    r = requests.post(url, headers=HEADERS, json=body)
    return r

version = step("Create Version", create_version)
version_id = None
if version:
    cv = version.get("containerVersion", {})
    version_id = cv.get("containerVersionId")
    print(f"  version id: {version_id}")

# ------------------------------------------------------------------
# 10. Publish
# ------------------------------------------------------------------
def publish_version():
    if not version_id:
        print("  Pulando - sem version id")
        return None
    url = f"https://www.googleapis.com/tagmanager/v2/accounts/{ACCOUNT_ID}/containers/{CONTAINER_ID}/versions/{version_id}:publish"
    r = requests.post(url, headers=HEADERS, json={})
    return r

step("Publish Container", publish_version)

# ------------------------------------------------------------------
# Summary
# ------------------------------------------------------------------
print("\n" + "="*60)
print("RESUMO")
print(f"Criados ({len(created)}): {', '.join(created)}")
if errors:
    print(f"\nErros ({len(errors)}):")
    for e in errors:
        print(f"  - {e}")
else:
    print("Nenhum erro!")
