"""页面管理 API — 管理员 CRUD + 前台公开读取"""
from typing import Optional, List
from datetime import datetime

from fastapi import APIRouter, Depends, HTTPException, Query
from pydantic import BaseModel, field_serializer
from sqlalchemy.ext.asyncio import AsyncSession
from sqlalchemy import select

from app.api.deps import get_db, get_admin_user
from app.core.models.page import Page
from app.core.models.user import User

router = APIRouter(prefix="/pages", tags=["页面管理"])


# ── Pydantic Schemas ──────────────────────────────────────────────────

class PageOut(BaseModel):
    id:           int
    title:        str
    slug:         str
    description:  Optional[str] = None
    content_html: Optional[str] = None
    content_css:  Optional[str] = None
    content_json: Optional[str] = None
    status:       str
    sort_order:   int
    created_at:   Optional[datetime] = None
    updated_at:   Optional[datetime] = None

    @field_serializer("created_at", "updated_at")
    def fmt_dt(self, v): return v.isoformat() if v else None

    model_config = {"from_attributes": True}


class PageListOut(BaseModel):
    id:          int
    title:       str
    slug:        str
    description: Optional[str] = None
    status:      str
    sort_order:  int
    created_at:  Optional[datetime] = None
    updated_at:  Optional[datetime] = None

    @field_serializer("created_at", "updated_at")
    def fmt_dt(self, v): return v.isoformat() if v else None

    model_config = {"from_attributes": True}


class PageCreate(BaseModel):
    title:       str
    slug:        str
    description: Optional[str] = None
    status:      str = "draft"
    sort_order:  int = 0


class PageUpdate(BaseModel):
    title:        Optional[str] = None
    slug:         Optional[str] = None
    description:  Optional[str] = None
    content_html: Optional[str] = None
    content_css:  Optional[str] = None
    content_json: Optional[str] = None
    status:       Optional[str] = None
    sort_order:   Optional[int] = None


# ── 管理员接口（需登录）────────────────────────────────────────────────

@router.get("", response_model=List[PageListOut], summary="页面列表")
async def list_pages(
    status: Optional[str] = None,
    db: AsyncSession = Depends(get_db),
    admin: User = Depends(get_admin_user),
):
    q = select(Page).where(Page.tenant_id == admin.tenant_id)
    if status:
        q = q.where(Page.status == status)
    q = q.order_by(Page.sort_order.asc(), Page.id.desc())
    rows = (await db.execute(q)).scalars().all()
    return rows


@router.post("", response_model=PageOut, status_code=201, summary="创建页面")
async def create_page(
    body: PageCreate,
    db: AsyncSession = Depends(get_db),
    admin: User = Depends(get_admin_user),
):
    # 检查 slug 唯一
    exist = (await db.execute(
        select(Page).where(Page.tenant_id == admin.tenant_id, Page.slug == body.slug)
    )).scalar_one_or_none()
    if exist:
        raise HTTPException(400, f"slug '{body.slug}' 已存在")

    page = Page(tenant_id=admin.tenant_id, **body.model_dump())
    db.add(page)
    await db.commit()
    await db.refresh(page)
    return page


@router.get("/{page_id}", response_model=PageOut, summary="页面详情（含完整 JSON/HTML）")
async def get_page(
    page_id: int,
    db: AsyncSession = Depends(get_db),
    admin: User = Depends(get_admin_user),
):
    page = (await db.execute(
        select(Page).where(Page.id == page_id, Page.tenant_id == admin.tenant_id)
    )).scalar_one_or_none()
    if not page:
        raise HTTPException(404, "页面不存在")
    return page


@router.put("/{page_id}", response_model=PageOut, summary="保存页面（GrapeJS 内容）")
async def update_page(
    page_id: int,
    body: PageUpdate,
    db: AsyncSession = Depends(get_db),
    admin: User = Depends(get_admin_user),
):
    page = (await db.execute(
        select(Page).where(Page.id == page_id, Page.tenant_id == admin.tenant_id)
    )).scalar_one_or_none()
    if not page:
        raise HTTPException(404, "页面不存在")

    for k, v in body.model_dump(exclude_unset=True).items():
        setattr(page, k, v)
    await db.commit()
    await db.refresh(page)
    return page


@router.delete("/{page_id}", status_code=204, summary="删除页面")
async def delete_page(
    page_id: int,
    db: AsyncSession = Depends(get_db),
    admin: User = Depends(get_admin_user),
):
    page = (await db.execute(
        select(Page).where(Page.id == page_id, Page.tenant_id == admin.tenant_id)
    )).scalar_one_or_none()
    if not page:
        raise HTTPException(404, "页面不存在")
    await db.delete(page)
    await db.commit()


# ── 前台公开接口（无需登录）──────────────────────────────────────────────

store_router = APIRouter(prefix="/store/pages", tags=["前台页面"])


@store_router.get("/{slug}", summary="前台获取已发布页面内容")
async def get_published_page(
    slug: str,
    db: AsyncSession = Depends(get_db),
):
    from sqlalchemy import text as sa_text
    # 自动取最小 tenant
    r = await db.execute(sa_text("SELECT MIN(id) FROM tenants"))
    tid = r.scalar_one_or_none() or 1

    page = (await db.execute(
        select(Page).where(
            Page.tenant_id == tid,
            Page.slug == slug,
            Page.status == "published",
        )
    )).scalar_one_or_none()
    if not page:
        raise HTTPException(404, "页面不存在或未发布")
    return {
        "id":           page.id,
        "title":        page.title,
        "slug":         page.slug,
        "description":  page.description,
        "content_html": page.content_html or "",
        "content_css":  page.content_css  or "",
    }
