# fb_kill_item.py
import os
from datetime import datetime, timezone, timedelta
from dotenv import load_dotenv

from facebook_business.api import FacebookAdsApi
from facebook_business.adobjects.ad import Ad
from facebook_business.adobjects.adset import AdSet
from facebook_business.adobjects.campaign import Campaign
from facebook_business.adobjects.adaccount import AdAccount
from facebook_business.exceptions import FacebookRequestError


# --- Initialize API ---
load_dotenv()
ACCESS_TOKEN = os.getenv("FB_ACCESS_TOKEN")
if not ACCESS_TOKEN:
    raise SystemExit("Missing FB_ACCESS_TOKEN in .env")

FacebookAdsApi.init(access_token=ACCESS_TOKEN)


# --- Core "pause" functions ---
def kill_ad(ad_id: str) -> bool:
    """Pause (kill) a specific Ad by its ID."""
    try:
        Ad(ad_id).api_update(params={"status": "PAUSED"})
        return True
    except Exception:
        return False


def kill_adset(adset_id: str) -> bool:
    try:
        AdSet(adset_id).api_update(params={"status": "PAUSED"})
        return True
    except Exception:
        try:
            cid = AdSet(adset_id).api_get(fields=["campaign_id"])["campaign_id"]
            Campaign(cid).api_update(params={"status": "PAUSED"})
            return True
        except Exception:
            return False


def kill_campaign(campaign_id: str) -> bool:
    """Pause (kill) a specific Campaign by its ID."""
    try:
        Campaign(campaign_id).api_update(params={"status": "PAUSED"})
        return True
    except Exception:
        return False

def format_account_report(data: dict) -> str:
    """Nicely formats the output into multi-line readable text."""
    lines = [
        f"📊  ACCOUNT STATUS REPORT",
        f"──────────────────────────────",
        f"🟢 Status:                {data['status']}",
        f"💶 Total Monthly Spend:   {data['total_monthly_spent (€)']} €",
        f"👥 Total Monthly Leads:   {data['total_mothly_leads']}",
        f"📈 Avg. Cost per Lead:    {data['avg_cost_per_lead (€)']} €",
        f"💰 Total Daily Budget:    {data['total_daily_budget (€)']} €",
        f"🗓️ Days Left in Month:    {data['days_left_in_month']}",
        f"🔮 Expected Total:        {data['projected_total (€)']} €",
        f"🎯 Monthly Cap:           {data['monthly_cap (€)']} €",
        f"⏸️ Paused Campaigns:      {len(data['paused_campaigns'])}",
        f"📝 Note:                  {data['note']}",
    ]
    return "\n".join(lines)

# --- Account-level monitor ---
def try_kill_account(account_id: str, cap_eur: float = 15000.0) -> dict:
    now = datetime.now(timezone.utc)
    since = now.replace(day=1, hour=0, minute=0, second=0)
    until = (now + timedelta(days=1))
    month_end = (now.replace(day=28) + timedelta(days=4)).replace(day=1) - timedelta(days=1)
    days_left = (month_end - now).days
    cutoff_date = (now - timedelta(days=90)).strftime("%Y-%m-%d")

    # --- spend + leads ---
    spend, leads = 0.0, 0
    try:
        insights = AdAccount(account_id).get_insights(
            fields=["spend", "actions"],
            params={"level": "account", "time_range": {"since": since.strftime("%Y-%m-%d"), "until": until.strftime("%Y-%m-%d")}},
        )
        data = insights[0] if insights else {}
        spend = float(data.get("spend", 0) or 0)
        for act in data.get("actions", []):
            if act.get("action_type") == "lead":
                leads = int(act.get("value", 0))
                break
    except Exception:
        pass
    avg_cpl = round(spend / leads, 2) if leads else None

    # --- active adsets (last 3 months) ---
    total_daily = 0.0
    try:
        adsets = AdAccount(account_id).get_ad_sets(
            fields=["daily_budget", "status", "created_time"],
            params={"limit": 500, "effective_status": ["ACTIVE"]},
        )
        for a in adsets:
            if a["status"] == "ACTIVE" and a["created_time"] >= cutoff_date:
                total_daily += float(a.get("daily_budget", 0)) / 100
    except Exception:
        pass

    projected_total = spend + (total_daily * days_left)
    note = "OK"
    if projected_total > 18000:
        note = "⚠️ Decrease campaign budgets!"
    elif projected_total < 15000:
        note = "✅ We can create more campaigns."

    # --- pause if above cap ---
    paused, status = [], "ACTIVE"
    if spend >= cap_eur:
        status = "⚠️ Over monthly cap — pausing all active campaigns"
        try:
            for c in AdAccount(account_id).get_campaigns(fields=["id"], params={"effective_status": ["ACTIVE"], "limit": 500}):
                # Campaign(c["id"]).api_update(params={"status": "PAUSED"})
                paused.append(c["id"])
        except Exception:
            pass

    result = {
        "status": status,
        "total_monthly_spent (€)": round(spend, 2),
        "total_mothly_leads": leads,
        "avg_cost_per_lead (€)": avg_cpl,
        "total_daily_budget (€)": round(total_daily, 2),
        "days_left_in_month": days_left,
        "projected_total (€)": round(projected_total, 2),
        "monthly_cap (€)": cap_eur,
        "paused_campaigns": paused,
        "note": note
    }
    return(format_account_report(result))

def main():
    kill_adset("120236863329350259")


if __name__ == "__main__":
    main()