"""
异步项目仓库

使用 AsyncBaseRepository 模式提供项目的异步数据访问操作。
"""

from typing import Optional, List
from sqlalchemy.ext.asyncio import AsyncSession
from src.models.entities import ProjectDB
from src.repositories.base_async import AsyncBaseRepository
import logging

logger = logging.getLogger(__name__)


class AsyncProjectRepository(AsyncBaseRepository[ProjectDB]):
    """
    Project 实体的异步仓库。

    继承自 AsyncBaseRepository 的所有异步 CRUD 操作，并添加项目特定的异步查询。
    """

    def __init__(self, session: AsyncSession):
        """
        初始化 AsyncProjectRepository。

        Args:
            session: 异步数据库会话
        """
        super().__init__(ProjectDB, session)

    async def get_by_name(self, name: str) -> Optional[ProjectDB]:
        """
        通过名称获取项目。

        Args:
            name: 项目名称

        Returns:
            项目实例或 None
        """
        return await self.get_by_field("name", name)

    async def list_active(
        self,
        limit: int = 100,
        offset: int = 0
    ) -> List[ProjectDB]:
        """
        列出所有活跃项目（未软删除）。

        Args:
            limit: 返回的最大项目数
            offset: 要跳过的项目数

        Returns:
            项目列表
        """
        return await self.list(
            skip=offset,
            limit=limit,
            filters={"deleted_at": None},
            sort_by="created_at",
            sort_order="desc"
        )

    async def list_by_status(
        self,
        status: str,
        limit: int = 100,
        offset: int = 0
    ) -> List[ProjectDB]:
        """
        按状态列出项目。

        Args:
            status: 项目状态过滤
            limit: 返回的最大项目数
            offset: 要跳过的项目数

        Returns:
            项目列表
        """
        return await self.list(
            skip=offset,
            limit=limit,
            filters={"status": status, "deleted_at": None},
            sort_by="created_at",
            sort_order="desc"
        )

    async def list_by_type(
        self,
        project_type: str,
        limit: int = 100,
        offset: int = 0
    ) -> List[ProjectDB]:
        """
        按类型列出项目。

        Args:
            project_type: 项目类型过滤
            limit: 返回的最大项目数
            offset: 要跳过的项目数

        Returns:
            项目列表
        """
        return await self.list(
            skip=offset,
            limit=limit,
            filters={"type": project_type, "deleted_at": None},
            sort_by="created_at",
            sort_order="desc"
        )

    async def list_with_relations(
        self,
        limit: int = 100,
        offset: int = 0
    ) -> List[ProjectDB]:
        """
        列出项目并预加载关联关系（assets, episodes, storyboards）。

        Args:
            limit: 返回的最大项目数
            offset: 要跳过的项目数

        Returns:
            带有预加载关系的项目列表
        """
        return await self.list(
            skip=offset,
            limit=limit,
            filters={"deleted_at": None},
            sort_by="created_at",
            sort_order="desc",
            eager_load=["assets", "episodes", "storyboards", "canvas_metadata"]
        )

    async def get_with_relations(self, project_id: str) -> Optional[ProjectDB]:
        """
        通过 ID 获取项目并预加载所有关联关系。

        Args:
            project_id: 项目 ID

        Returns:
            带有预加载关系的项目实例，如果未找到则返回 None
        """
        return await self.get_with_relations(
            project_id,
            eager_load=["assets", "episodes", "storyboards", "canvas_metadata"]
        )

    async def search_by_name(
        self,
        name_query: str,
        limit: int = 20
    ) -> List[ProjectDB]:
        """
        按名称搜索项目（不区分大小写的部分匹配）。

        Args:
            name_query: 名称搜索查询
            limit: 返回的最大项目数

        Returns:
            匹配的项目列表
        """
        return await self.list(
            limit=limit,
            filters={"name__ilike": f"%{name_query}%", "deleted_at": None},
            sort_by="created_at",
            sort_order="desc"
        )

    async def count_active(self) -> int:
        """
        计数活跃项目（未软删除）。

        Returns:
            活跃项目数
        """
        return await self.count(filters={"deleted_at": None})

    async def count_by_status(self, status: str) -> int:
        """
        按状态计数项目。

        Args:
            status: 项目状态

        Returns:
            具有给定状态的项目数
        """
        return await self.count(filters={"status": status, "deleted_at": None})

    async def count_by_type(self, project_type: str) -> int:
        """
        按类型计数项目。

        Args:
            project_type: 项目类型

        Returns:
            具有给定类型的项目数
        """
        return await self.count(filters={"type": project_type, "deleted_at": None})
