"""Article search (read-only, for admin page + global top-bar)."""
from __future__ import annotations

from datetime import datetime
from typing import Any

from fastapi import Depends, Query
from sqlalchemy import desc, or_, select
from sqlalchemy.orm import Session

from govcrawler.models import Article, CrawlSite, CrawlTarget

from ._common import _session, router


def _articles_base_stmt():
    return (
        select(
            Article,
            CrawlSite.site_code.label("site_code"),
            CrawlTarget.target_code.label("target_code"),
        )
        .select_from(Article)
        .join(CrawlSite, CrawlSite.id == Article.site_id, isouter=True)
        .join(CrawlTarget, CrawlTarget.id == Article.target_id, isouter=True)
    )


@router.get("/api/articles/search")
def search_articles(
    q: str | None = Query(None, description="substring of title or content_text"),
    site: str | None = Query(None, description="crawl_site.site_code"),
    target: str | None = Query(None, description="crawl_target.target_code"),
    status: str | None = Query(None, description="ready | failed | raw"),
    since: datetime | None = None,
    limit: int = Query(50, ge=1, le=500),
    s: Session = Depends(_session),
) -> dict[str, Any]:
    stmt = _articles_base_stmt().order_by(desc(Article.fetched_at)).limit(limit)
    if q:
        like = f"%{q}%"
        stmt = stmt.where(or_(Article.title.ilike(like), Article.content_text.ilike(like)))
    if site:
        stmt = stmt.where(CrawlSite.site_code == site)
    if target:
        stmt = stmt.where(CrawlTarget.target_code == target)
    if status:
        stmt = stmt.where(Article.status == status)
    if since:
        stmt = stmt.where(Article.fetched_at >= since)
    rows = s.execute(stmt).all()
    return {
        "count": len(rows),
        "items": [
            {
                "id": r.Article.id,
                "site_code": r.site_code,
                "target_code": r.target_code,
                "title": r.Article.title,
                "url": r.Article.url,
                "status": r.Article.status,
                "fetch_strategy": r.Article.fetch_strategy,
                "has_attachment": r.Article.has_attachment,
                "channel_name": r.Article.channel_name,
                "content_category": r.Article.content_category,
                "publish_time": r.Article.publish_time.isoformat() if r.Article.publish_time else None,
                "fetched_at": r.Article.fetched_at.isoformat() if r.Article.fetched_at else None,
                "exported_to_rag_at": r.Article.exported_to_rag_at.isoformat()
                if r.Article.exported_to_rag_at
                else None,
            }
            for r in rows
        ],
    }
