"""Module 4 — the unified daily log.

Read-only by design. Every "quick entry" on the Daily Log screen posts to the module
endpoint that already owns that rule (applications, complaints, equipment); this router
only answers what a given Asia/Dhaka day looks like.
"""
from datetime import date

from fastapi import APIRouter, Depends, HTTPException, Query, status
from sqlalchemy.orm import Session

from app.api.deps import get_current_user
from app.core.time import today_local
from app.db.session import get_db
from app.models.user import User
from app.schemas.application import ApplicationListItem
from app.schemas.complaint import ComplaintListItem
from app.schemas.daily_log import DailyLog
from app.schemas.equipment import CollectionOut, DistributionListItem
from app.services import daily_log as service

router = APIRouter(prefix="/daily-log", tags=["daily-log"])


@router.get("", response_model=DailyLog)
def get_daily_log(
    db: Session = Depends(get_db),
    current_user: User = Depends(get_current_user),
    day: date | None = Query(None, description="Asia/Dhaka calendar day; defaults to today"),
    mine: bool = Query(False, description="Only entries logged by the calling user"),
) -> DailyLog:
    """One day's activity across all three modules, plus the live backlog."""
    day = day or today_local()
    if day > today_local():
        raise HTTPException(
            status_code=status.HTTP_422_UNPROCESSABLE_ENTITY,
            detail="Cannot open a daily log for a future date",
        )

    data = service.build(db, day, actor_id=current_user.id if mine else None)

    return DailyLog(
        day=data["day"],
        is_today=data["is_today"],
        mine_only=data["mine_only"],
        counts=data["counts"],
        pending=data["pending"],
        timeline=data["timeline"],
        timeline_truncated=data["timeline_truncated"],
        applications=[ApplicationListItem.model_validate(a) for a in data["applications"]],
        complaints=[ComplaintListItem.model_validate(c) for c in data["complaints"]],
        distributions=[DistributionListItem.model_validate(d) for d in data["distributions"]],
        collections=[CollectionOut.model_validate(c) for c in data["collections"]],
    )
