import datetime
import secrets
from fastapi import APIRouter, Request, Depends, Query
from fastapi.responses import JSONResponse
from sqlalchemy.orm import Session
from database import get_db
from models import Article, Advertisement, NewsletterSubscriber, PushSubscription

router = APIRouter(prefix="/api")


@router.get("/latest-news")
async def latest_news(
    request: Request, db: Session = Depends(get_db),
    after: str = Query(""),
):
    lang = request.query_params.get("lang", request.cookies.get("lang", "en"))
    q = db.query(Article).filter(Article.status == "published").order_by(Article.published_at.desc())
    if after:
        try:
            after_dt = datetime.datetime.fromisoformat(after)
            q = q.filter(Article.published_at > after_dt)
        except ValueError:
            pass
    articles = q.limit(10).all()
    result = []
    for a in articles:
        result.append({
            "id": a.id,
            "title": a.title_ar if lang == "ar" else a.title_en,
            "slug": a.slug,
            "image": a.featured_image or "",
            "category": a.category.name_ar if lang == "ar" else a.category.name_en if a.category else "",
            "category_color": a.category.color if a.category else "#c70000",
            "date": a.published_at.isoformat() if a.published_at else "",
            "author": a.author.display_name_ar if lang == "ar" else a.author.display_name if a.author else "",
        })
    return JSONResponse(result)


@router.post("/ad/{ad_id}/impression")
async def ad_impression(ad_id: int, db: Session = Depends(get_db)):
    ad = db.query(Advertisement).get(ad_id)
    if ad:
        ad.impressions += 1
        db.commit()
    return JSONResponse({"ok": True})


@router.post("/ad/{ad_id}/click")
async def ad_click(ad_id: int, db: Session = Depends(get_db)):
    ad = db.query(Advertisement).get(ad_id)
    if ad:
        ad.clicks += 1
        db.commit()
    return JSONResponse({"ok": True})


@router.post("/newsletter/subscribe")
async def newsletter_subscribe(request: Request, db: Session = Depends(get_db)):
    try:
        body = await request.json()
    except Exception:
        body = {}
    email = body.get("email", "").strip().lower()
    if not email or "@" not in email:
        return JSONResponse({"error": "Invalid email"}, status_code=400)
    existing = db.query(NewsletterSubscriber).filter_by(email=email).first()
    if existing:
        if not existing.is_active:
            existing.is_active = True
            db.commit()
        return JSONResponse({"message": "Subscribed successfully"})
    sub = NewsletterSubscriber(
        email=email,
        unsubscribe_token=secrets.token_urlsafe(32),
    )
    db.add(sub)
    db.commit()
    return JSONResponse({"message": "Subscribed successfully"})


@router.get("/newsletter/unsubscribe")
async def newsletter_unsubscribe(token: str = Query(...), db: Session = Depends(get_db)):
    sub = db.query(NewsletterSubscriber).filter_by(unsubscribe_token=token).first()
    if sub:
        sub.is_active = False
        db.commit()
    from fastapi.responses import HTMLResponse
    return HTMLResponse("<html><body><h2>You have been unsubscribed.</h2></body></html>")


@router.post("/push/subscribe")
async def push_subscribe(request: Request, db: Session = Depends(get_db)):
    body = await request.json()
    endpoint = body.get("endpoint", "")
    keys = body.get("keys", {})
    if not endpoint:
        return JSONResponse({"error": "Missing endpoint"}, status_code=400)
    existing = db.query(PushSubscription).filter_by(endpoint=endpoint).first()
    if not existing:
        sub = PushSubscription(
            endpoint=endpoint,
            p256dh=keys.get("p256dh", ""),
            auth=keys.get("auth", ""),
        )
        db.add(sub)
        db.commit()
    return JSONResponse({"message": "Subscribed"})


@router.post("/push/unsubscribe")
async def push_unsubscribe(request: Request, db: Session = Depends(get_db)):
    body = await request.json()
    endpoint = body.get("endpoint", "")
    sub = db.query(PushSubscription).filter_by(endpoint=endpoint).first()
    if sub:
        db.delete(sub)
        db.commit()
    return JSONResponse({"message": "Unsubscribed"})
