from fastapi import APIRouter, Depends, HTTPException, Request
from fastapi.responses import PlainTextResponse
from pydantic import BaseModel, Field

from app.api.deps import require_admin
from app.core.config import get_settings
from app.models import User
from app.services import campaigns as camp
from app.services import launch as launch_svc

router = APIRouter(tags=["launch"])


class SocialIn(BaseModel):
    public_base_url: str | None = None
    linkedin_org_url: str | None = None
    linkedin_personal_url: str | None = None
    x_handle: str | None = None
    instagram_handle: str | None = None
    facebook_page_url: str | None = None
    telegram_channel: str | None = None
    telegram_chat_id: str | None = None
    whatsapp_business: str | None = None
    reddit_sub: str | None = None
    notes: str | None = None


class ComposeIn(BaseModel):
    channel: str = "linkedin"
    text: str = Field(min_length=2)
    path: str = "/l/lanzamiento"
    utm_campaign: str = "launch"


class TelegramSendIn(BaseModel):
    text: str = Field(min_length=2)
    chat_id: str | None = None


def _origin(request: Request, social: dict | None = None) -> str:
    social = social or launch_svc.get_social()
    configured = (social.get("public_base_url") or "").rstrip("/")
    if configured:
        return configured
    settings = get_settings()
    extra = (getattr(settings, "public_base_url", None) or "").rstrip("/")
    if extra:
        return extra
    return str(request.base_url).rstrip("/")


@router.get("/public/landings")
def public_landings(request: Request):
    origin = _origin(request)
    return {"origin": origin, "items": launch_svc.list_landings(origin)}


@router.get("/public/landings/{slug}")
def public_landing(slug: str, request: Request):
    origin = _origin(request)
    for item in launch_svc.list_landings(origin):
        if item["slug"] == slug:
            return item
    raise HTTPException(404, "Landing no encontrada")


@router.get("/admin/launch/overview")
def launch_overview(request: Request, _: User = Depends(require_admin)):
    social = launch_svc.get_social()
    origin = _origin(request, social)
    camp.seed_default_campaigns()
    items = [launch_svc.enrich_campaign(c, origin) for c in camp.list_campaigns()]
    settings = get_settings()
    bot = bool(settings.telegram_bot_token)
    return {
        "origin": origin,
        "social": social,
        "landings": launch_svc.list_landings(origin),
        "campaigns": items,
        "telegram_bot": bot,
        "bio": launch_svc.public_bio(origin, social),
        "readiness": launch_svc.readiness(
            origin=origin, social=social, telegram_bot=bot, campaigns=items
        ),
        "manual_path": "docs/ADMIN-LANZAMIENTO.md",
        "wow": "Publicidad operativa: composer nativo + landings UTM + kit. Sin fingir APIs de Meta.",
    }


@router.put("/admin/launch/social")
def launch_save_social(payload: SocialIn, _: User = Depends(require_admin)):
    return launch_svc.save_social(payload.model_dump(exclude_none=True))


@router.post("/admin/launch/compose")
def launch_compose(payload: ComposeIn, request: Request, _: User = Depends(require_admin)):
    origin = _origin(request)
    url = launch_svc.utm_link(
        origin, payload.path, source=payload.channel, campaign=payload.utm_campaign
    )
    return {
        "share_url": url,
        "compose": launch_svc.compose_urls(channel=payload.channel, text=payload.text, url=url),
        "howto": launch_svc._howto(payload.channel),
    }


@router.post("/admin/launch/telegram")
def launch_telegram(payload: TelegramSendIn, _: User = Depends(require_admin)):
    return launch_svc.send_telegram(payload.text, payload.chat_id)


@router.get("/public/bio")
def public_bio(request: Request):
    social = launch_svc.get_social()
    origin = _origin(request, social)
    return launch_svc.public_bio(origin, social)


@router.get("/admin/launch/kit.md")
def launch_kit(request: Request, _: User = Depends(require_admin)):
    social = launch_svc.get_social()
    origin = _origin(request, social)
    camp.seed_default_campaigns()
    md = launch_svc.kit_markdown(origin, camp.list_campaigns(), social)
    return PlainTextResponse(
        md,
        media_type="text/markdown; charset=utf-8",
        headers={"Content-Disposition": "attachment; filename=jobsworld-kit.md"},
    )


@router.get("/admin/launch/ads.csv")
def launch_ads_csv(request: Request, _: User = Depends(require_admin)):
    origin = _origin(request)
    csv = launch_svc.ads_csv(origin)
    return PlainTextResponse(
        csv,
        media_type="text/csv; charset=utf-8",
        headers={"Content-Disposition": "attachment; filename=jobsworld-ads.csv"},
    )


@router.get("/admin/launch/week.ics")
def launch_week_ics(request: Request, _: User = Depends(require_admin)):
    origin = _origin(request)
    camp.seed_default_campaigns()
    ics = launch_svc.week_ics(camp.list_campaigns(), origin)
    return PlainTextResponse(
        ics,
        media_type="text/calendar; charset=utf-8",
        headers={"Content-Disposition": "attachment; filename=jobsworld-publicacion.ics"},
    )
