from __future__ import annotations

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

from src.domain.composition_recipes.models import CompositionRecipeRecord


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

    async def get_by_slug(self, slug: str, *, active_only: bool = True):
        query = select(CompositionRecipeRecord).where(CompositionRecipeRecord.slug == slug)
        if active_only:
            query = query.where(CompositionRecipeRecord.is_active.is_(True))
        return (await self.db.execute(query)).scalar_one_or_none()

    async def get_for_prompt_suggestion(self, suggestion_id, *, active_only: bool = True):
        from src.domain.prompt_suggestions.models import PromptSuggestion

        query = (
            select(CompositionRecipeRecord)
            .join(
                PromptSuggestion,
                PromptSuggestion.composition_recipe_id == CompositionRecipeRecord.id,
            )
            .where(PromptSuggestion.id == suggestion_id)
        )
        if active_only:
            query = query.where(CompositionRecipeRecord.is_active.is_(True))
        return (await self.db.execute(query)).scalar_one_or_none()

    async def list(self, *, active_only: bool = False):
        query = select(CompositionRecipeRecord)
        if active_only:
            query = query.where(CompositionRecipeRecord.is_active.is_(True))
        result = await self.db.execute(query.order_by(CompositionRecipeRecord.slug))
        return list(result.scalars().all())
