import os, json
from datetime import datetime, timezone
from facebook_business.api import FacebookAdsApi
from facebook_business.adobjects.adset import AdSet
from facebook_business.adobjects.adactivity import AdActivity
from dotenv import load_dotenv


load_dotenv()
FacebookAdsApi.init(access_token=os.getenv("FB_ACCESS_TOKEN"))
AD_ACCOUNT_ID = os.getenv("AD_ACCOUNT_ID")  # act_857066298332756

def get_last_budget_change(adset_id):
    acts = AdSet(adset_id).get_activities(
        fields=[
            AdActivity.Field.event_time,
            AdActivity.Field.event_type,
            AdActivity.Field.extra_data,
            AdActivity.Field.actor_name,
        ],
        params={"limit": 50},
    )

    for a in acts:
        d = a.export_all_data()
        if "BUDGET" not in d.get("event_type", "").upper():
            continue

        e = d.get("extra_data")
        if isinstance(e, str):
            try: e = json.loads(e)
            except: e = {}

        oldv = (e.get("old_value") or {}).get("old_value")
        newv = (e.get("new_value") or {}).get("new_value")

        return {
            "time": d.get("event_time"),
            "actor": d.get("actor_name"),
            "old_budget": oldv,
            "new_budget": newv
        }
    return None


def was_scaled_in_last_48h(adset_id):
    """Return True if ad set was scaled (budget changed) within last 48 hours."""
    change = get_last_budget_change(adset_id)
    if not change or not change.get("time"):
        return False

    t = change["time"].replace("+0000", "+00:00")
    t = datetime.fromisoformat(t).astimezone(timezone.utc)
    now = datetime.now(timezone.utc)
    diff_hours = (now - t).total_seconds() / 3600

    return diff_hours <= 48


def scale_adset_budget(adset_id):
    """
    Increases the ad set's current budget by 15%.
    Works for daily_budget or lifetime_budget automatically.
    Returns the new budget value (in EUR) or None on failure.
    """
    try:
        adset = AdSet(adset_id).api_get(fields=["daily_budget", "lifetime_budget"])
        b = adset.get("daily_budget") or adset.get("lifetime_budget")
        if not b:
            return None

        # Convert from string cents → float euros
        old_budget = int(b)
        new_budget = int(round(old_budget * 1.2))  # +15%

        # Decide which field to update
        update_field = "daily_budget" if adset.get("daily_budget") else "lifetime_budget"

        # Push update via API
        AdSet(adset_id).api_update(params={update_field: str(new_budget)})

        return new_budget / 100.0  # return in EUR
    except Exception as e:
        return None

if __name__ == "__main__":
    print(was_scaled_in_last_48h("120231857409700259"))