"""素材仓储接口定义。"""

from abc import ABC, abstractmethod

from packages.domain import Asset


class AssetRepository(ABC):
    @abstractmethod
    def create(self, asset: Asset) -> Asset:
        pass

    @abstractmethod
    def find_by_id(self, asset_id: str) -> Asset | None:
        pass

    @abstractmethod
    def find_by_project(
        self,
        project_id: str,
        skip: int = 0,
        limit: int = 100,
    ) -> list[Asset]:
        pass

    @abstractmethod
    def find_by_library(
        self,
        library_id: str,
        skip: int = 0,
        limit: int = 100,
    ) -> list[Asset]:
        pass

    @abstractmethod
    def find_by_library_and_file_type(
        self,
        library_id: str,
        file_type: str,
        skip: int = 0,
        limit: int = 100,
    ) -> list[Asset]:
        pass

    @abstractmethod
    def update(self, asset: Asset) -> Asset:
        pass

    @abstractmethod
    def delete(self, asset_id: str) -> bool:
        pass

    @abstractmethod
    def batch_delete(self, asset_ids: list[str]) -> int:
        """批量删除素材，返回实际删除数量。"""
        pass

    @abstractmethod
    def count_by_project(self, project_id: str) -> int:
        pass

    @abstractmethod
    def count_by_project_ids(self, project_ids: list[str]) -> int:
        pass

    @abstractmethod
    def sum_storage_by_project_ids(self, project_ids: list[str]) -> int:
        pass

    @abstractmethod
    def search_candidates(
        self,
        project_id: str,
        *,
        file_type: str | None = None,
        min_quality_score: float | None = None,
        min_duration: float | None = None,
        max_duration: float | None = None,
        classification_category: str | None = None,
        tags: list[str] | None = None,
        status: str | None = None,
        limit: int = 50,
    ) -> list[Asset]:
        """按筛选条件搜索候选素材，按质量分降序排列。"""
        pass

    @abstractmethod
    def find_by_tag_ids(
        self,
        tag_ids: list[str],
        skip: int = 0,
        limit: int = 100,
    ) -> list[Asset]:
        """查找包含所有指定标签的素材。"""
        pass

    @abstractmethod
    def find_by_library_and_file_hash(
        self,
        library_id: str,
        file_hash: str,
    ) -> Asset | None:
        """按素材库 + 文件哈希查找已有素材（去重检测）。"""
        pass
