"""
Sequential document numbers: PREFIX-YEAR-00001 (PO-2026-00001, GRN-2026-00042, ...).

The next number is one more than the highest number already issued for that prefix and
year. A transaction-level advisory lock serialises concurrent requests for the same
series, so two users saving at the same moment never receive the same number.
"""
from datetime import datetime, timezone

from sqlalchemy import select, text
from sqlalchemy.ext.asyncio import AsyncSession


async def next_document_number(db: AsyncSession, column, prefix: str) -> str:
    stem = f"{prefix}-{datetime.now(timezone.utc).year}-"
    await db.execute(text("SELECT pg_advisory_xact_lock(hashtext(:series))"), {"series": stem})
    issued = (await db.execute(select(column).where(column.like(f"{stem}%")))).scalars().all()
    highest = max((int(n[len(stem):]) for n in issued if n[len(stem):].isdigit()), default=0)
    return f"{stem}{highest + 1:05d}"
