"""Page routes for the EPUB search web UI.""" from __future__ import annotations import logging from fastapi import APIRouter, Request from fastapi.responses import HTMLResponse from sqlalchemy import select from sqlalchemy.orm import Session from python.ebook_search.api.web import templates from python.orm.richie import EbookSource logger = logging.getLogger(__name__) router = APIRouter() @router.get("/", response_class=HTMLResponse) def index(request: Request) -> HTMLResponse: """Render the search page.""" return templates.TemplateResponse(request, "search.html", {"config": request.app.state.config}) @router.get("/books", response_class=HTMLResponse) def books(request: Request) -> HTMLResponse: """Render the indexed books page.""" with Session(request.app.state.engine) as session: sources = list(session.scalars(select(EbookSource).order_by(EbookSource.title)).all()) logger.info("ebook_books_page_loaded count=%s", len(sources)) return templates.TemplateResponse(request, "books.html", {"sources": sources}) @router.get("/books/{source_id}", response_class=HTMLResponse) def book_detail(source_id: int, request: Request) -> HTMLResponse: """Render details for one indexed book.""" with Session(request.app.state.engine) as session: source = session.get(EbookSource, source_id) if source is not None: chapter_count = len(source.chapters) chunk_count = len(source.chunks) else: chapter_count = 0 chunk_count = 0 logger.info( "ebook_book_detail_loaded source_id=%s found=%s chapters=%s chunks=%s", source_id, source is not None, chapter_count, chunk_count, ) return templates.TemplateResponse( request, "book_detail.html", {"chapter_count": chapter_count, "chunk_count": chunk_count, "source": source}, )