"""Campañas de marketing accionables (cola draft→ready→scheduled→sent)."""

from __future__ import annotations

import json
import secrets
from datetime import datetime, timezone
from pathlib import Path
from typing import Any

from app.core.config import get_settings


def _path() -> Path:
    p = get_settings().data_dir / "campaigns.json"
    if not p.exists():
        p.write_text("[]", encoding="utf-8")
    return p


def _load() -> list[dict[str, Any]]:
    try:
        data = json.loads(_path().read_text(encoding="utf-8"))
        return data if isinstance(data, list) else []
    except Exception:  # noqa: BLE001
        return []


def _save(items: list[dict[str, Any]]) -> None:
    _path().write_text(json.dumps(items, ensure_ascii=False, indent=2), encoding="utf-8")


def list_campaigns() -> list[dict[str, Any]]:
    return sorted(_load(), key=lambda x: x.get("created_at") or "", reverse=True)


def create_campaign(
    *,
    title: str,
    channel: str,
    body: str,
    utm_campaign: str = "",
    status: str = "draft",
) -> dict[str, Any]:
    now = datetime.now(timezone.utc).isoformat()
    item = {
        "id": f"camp-{secrets.token_hex(4)}",
        "title": title.strip()[:160],
        "channel": channel.strip()[:64] or "linkedin",
        "body": body.strip(),
        "utm_campaign": utm_campaign or f"camp_{secrets.token_hex(3)}",
        "status": status if status in {"draft", "ready", "scheduled", "sent"} else "draft",
        "created_at": now,
        "updated_at": now,
    }
    items = _load()
    items.insert(0, item)
    _save(items)
    return item


def update_campaign(cid: str, **fields: Any) -> dict[str, Any]:
    items = _load()
    for i, it in enumerate(items):
        if it.get("id") == cid:
            for k, v in fields.items():
                if v is not None and k in {"title", "channel", "body", "utm_campaign", "status"}:
                    it[k] = v
            it["updated_at"] = datetime.now(timezone.utc).isoformat()
            items[i] = it
            _save(items)
            return it
    raise FileNotFoundError(cid)


def seed_default_campaigns() -> list[dict[str, Any]]:
    if _load():
        return list_campaigns()
    defaults = [
        {
            "title": "Día 1 — Problema: 40 pestañas de empleo",
            "channel": "linkedin",
            "body": (
                "¿Sigues con 15 portales abiertos y un Excel? JobsWorld unifica ES + remoto INT, "
                "adapta tu CV con IA local y tú apruebas antes de enviar. Empieza gratis → "
                "/pricing?utm_source=linkedin&utm_campaign=week1_d1"
            ),
        },
        {
            "title": "Día 3 — Precio irresistible",
            "channel": "linkedin",
            "body": (
                "Teal/Huntr cobran ~30–40€. Profesional JobsWorld: potencia IA + portales ES/INT "
                "a un precio pensado para volumen. Mira /pricing"
            ),
        },
        {
            "title": "Día 5 — Privacidad del CV",
            "channel": "telegram",
            "body": (
                "Tu CV no tiene que viajar a un SaaS USA. JobsWorld usa IA local (lab) + revisión humana. "
                "Demo 8′ en la app."
            ),
        },
    ]
    out = []
    for d in defaults:
        out.append(create_campaign(**d, status="ready", utm_campaign="week1"))
    return out
