from __future__ import annotations

from datetime import UTC, datetime
from uuid import UUID

from sqlalchemy import select
from sqlalchemy.ext.asyncio import AsyncSession
from src.domain.guest_drafts.models import GuestDraft, GuestDraftAsset


class GuestDraftRepository:
    def __init__(self, db: AsyncSession): self._db = db

    async def create(self, **kwargs) -> GuestDraft:
        row = GuestDraft(**kwargs)
        self._db.add(row)
        await self._db.flush()
        await self._db.refresh(row)
        return row

    async def get_active_by_hash(self, token_hash: str) -> GuestDraft | None:
        result = await self._db.execute(
            select(GuestDraft)
            .where(GuestDraft.token_hash == token_hash)
            .where(GuestDraft.expires_at > datetime.now(UTC))
        )
        return result.scalar_one_or_none()

    async def get_active_by_id(self, draft_id: UUID) -> GuestDraft | None:
        result = await self._db.execute(
            select(GuestDraft)
            .where(GuestDraft.id == draft_id)
            .where(GuestDraft.expires_at > datetime.now(UTC))
        )
        return result.scalar_one_or_none()

    async def add_asset(self, **kwargs) -> GuestDraftAsset:
        row = GuestDraftAsset(**kwargs)
        self._db.add(row)
        await self._db.flush()
        await self._db.refresh(row)
        return row

    async def list_assets(self, draft_id: UUID) -> list[GuestDraftAsset]:
        result = await self._db.execute(
            select(GuestDraftAsset)
            .where(GuestDraftAsset.guest_draft_id == draft_id)
            .order_by(GuestDraftAsset.created_at)
        )
        return list(result.scalars().all())
