import numpy as np
from utils.xtracker_fetch import get_pace
import pandas as pd
from zoneinfo import ZoneInfo
from datetime import datetime, timezone, timedelta
from datetime import datetime, timezone
from pathlib import Path
from utils.helpers import midpoint, calculate_center, calculate_skewness
from utils.xtracker_fetch import get_18h_projections
from utils.xtracker_fetch import fetch_xtracker_cached
from config import HISTORY_FILE, SCORE_WEIGHTS


def get_live_deviation_analysis(slug: str):        ## calculates the deviation from the pace published on xtracker should be available as a signal
    """Hauptfunktion – komplett dyn.py Logik"""
    trackings = fetch_user_trackings()
    tracking_id = find_tracking_id_by_slug(slug, trackings)
    if not tracking_id:
        return None, "Kein XTracker-Match für diesen Slug"

    tracker_data = fetch_xtracker_data(tracking_id)
    if not tracker_data:
        return None, "XTracker-Daten nicht erreichbar"

    live_proj = get_18h_projections(tracker_data)

    event = fetch_event(slug)
    if not event:
        return None, "Polymarket Event nicht gefunden"

    # Bucket-Extraktion (identisch dyn.py)
    buckets = []
    for m in event.get("markets", [event]):
        q = m.get("question") or ""
        if not q:
            continue

        # === NEW NORMALIZED LABEL + RANGE ===
        clean_label, low, high = normalize_bucket(q)
        mid = midpoint(low, high)          # now always realistic (no weird *1.5 hack needed)

        try:
            outcome_str = m.get("outcomePrices", '["0","1"]')
            prices = json.loads(outcome_str) if isinstance(outcome_str, str) else (outcome_str or [0])
            yes_price = float(prices[0])
        except:
            yes_price = 0.0

        buckets.append({
            "label": clean_label,          # ← now always "0 - 399", "1200 - 1219", etc.
            "low": low,
            "high": high,
            "mid": mid,
            "market_prob": yes_price
        })

    if not buckets:
        return None, "Keine Buckets gefunden"

    mids = np.array([b["mid"] for b in buckets])
    probs = np.array([b["market_prob"] for b in buckets])
    if probs.sum() > 0:
        probs /= probs.sum()

    center = calculate_center(mids, probs)
    skew = calculate_skewness(mids, probs)

    # Dynamics-History
    history_df = load_history()
    history_df = update_history(history_df, center, skew, {"proj_7d": live_proj["proj_7d"]})
    dynamics = compute_dynamics(history_df)

    scored = compute_bucket_scores(buckets, mids, probs, center, skew, live_proj, dynamics)

    return {
        "scored_buckets": scored,
        "center": round(center, 1),
        "skew": round(skew, 2),
        "projections": live_proj,
        "dynamics": dynamics,
        "tracking_id": tracking_id
    }, None

