from typing import List, Optional, Dict, Any
from .base import BaseMixin
from ..const import API_PATHS


class FileQuery(BaseMixin):
    async def infos(self, file_ids: List[int]) -> Dict[str, Any]:
        """
        批量获取文件信息
        
        批量获取指定文件的详细信息。
        
        Args:
            file_ids: 文件ID数组
        
        Returns:
            Dict[str, Any]: API响应数据
            
        Returns Data Structure:
            {
                "code": 0,
                "message": "ok",
                "data": {
                    "fileList": [
                        {
                            "fileId": 12345,
                            "filename": "文件名.txt",
                            "parentFileId": 0,
                            "type": 0,
                            "etag": "md5值",
                            "size": 1024,
                            "category": 0,
                            "status": 0,
                            "punishFlag": 0,
                            "s3KeyFlag": "标识",
                            "storageNode": "m0",
                            "trashed": 0,
                            "createAt": "2024-01-01 12:00:00",
                            "updateAt": 1234567890
                        }
                    ]
                }
            }
        
        字段说明:
            type: 0-文件, 1-文件夹
            category: 文件分类，0-未知, 1-音频, 2-视频, 3-图片
            status: 文件审核状态，大于100为审核驳回文件
            trashed: 是否在回收站，0否, 1是
            storageNode: m0是ceph, m1以上为minio
        
        Example:
            >>> result = await file_query.infos([12345, 12346])
            >>> files = result["data"]["fileList"]
            >>> for file in files:
            ...     print(f"{file['filename']}: {file['size']} 字节")
        """
        return await self._send_request(
            API_PATHS.file_infos,
            json={
                "fileIds": file_ids
            }
        )

    async def list(self, parent_file_id: int, limit: int,
                  search_data: Optional[str] = None, search_mode: Optional[int] = None,
                  last_file_id: Optional[int] = None) -> Dict[str, Any]:
        """
        获取文件列表(推荐)
        
        获取指定目录下的文件列表，支持分页查询。
        此接口查询结果包含回收站的文件，需自行根据字段trashed判断处理。
        
        注意：此接口有访问频率限制(QPS: 15)。
        
        Args:
            parent_file_id: 文件夹ID，根目录传0
            limit: 每页文件数量，最大不超过100
            search_data: 搜索关键字，将无视文件夹ID参数，进行全局查找(可选)
            search_mode: 搜索模式(可选)，0-全文模糊搜索，1-精准搜索
            last_file_id: 翻页查询时需要填写(可选)
        
        Returns:
            Dict[str, Any]: API响应数据
            
        Returns Data Structure:
            {
                "code": 0,
                "message": "ok",
                "data": {
                    "lastFileId": -1,
                    "fileList": [
                        {
                            "fileId": 12345,
                            "filename": "文件名.txt",
                            "type": 0,
                            "size": 1024,
                            "etag": "md5值",
                            "status": 0,
                            "parentFileId": 0,
                            "category": 0,
                            "trashed": 0
                        }
                    ]
                }
            }
        
        字段说明:
            lastFileId: -1代表最后一页(无需再翻页查询)，其他代表下一页开始的文件id
            type: 0-文件, 1-文件夹
            category: 文件分类，0-未知, 1-音频, 2-视频, 3-图片
            trashed: 文件是否在回收站标识，0否, 1是
        
        Example:
            >>> result = await file_query.list(0, 50)
            >>> files = result["data"]["fileList"]
            >>> last_id = result["data"]["lastFileId"]
            >>> if last_id != -1:
            ...     # 继续翻页
            ...     next_result = await file_query.list(0, 50, last_file_id=last_id)
        """
        params = {
            "parentFileId": parent_file_id,
            "limit": limit
        }
        if search_data is not None:
            params["searchData"] = search_data
        if search_mode is not None:
            params["searchMode"] = search_mode
        if last_file_id is not None:
            params["lastFileId"] = last_file_id
        
        return await self._send_request(
            API_PATHS.file_list_v2,
            params=params
        )

    async def page(self, parent_file_id: int, page: int, limit: int,
                   order_by: str, order_direction: str, trashed: Optional[bool] = None,
                   search_data: Optional[str] = None) -> Dict[str, Any]:
        """
        获取文件列表(分页)
        
        获取指定目录下的文件列表，支持排序和分页。
        
        注意：此接口有访问频率限制(QPS: 10)。
        
        Args:
            parent_file_id: 文件夹ID，根目录传0
            page: 页码数
            limit: 每页文件数量，最大不超过100
            order_by: 排序字段，例如: file_id, size, file_name
            order_direction: 排序方向，asc或desc
            trashed: 是否查看回收站的文件(可选)
            search_data: 搜索关键字(可选)
        
        Returns:
            Dict[str, Any]: API响应数据
            
        Returns Data Structure:
            {
                "code": 0,
                "message": "ok",
                "data": {
                    "fileList": [
                        {
                            "fileID": 12345,
                            "filename": "文件名.txt",
                            "type": 0,
                            "size": 1024,
                            "etag": "md5值",
                            "status": 0,
                            "parentFileId": 0,
                            "parentName": "父目录名",
                            "category": 0,
                            "contentType": "application/octet-stream"
                        }
                    ]
                }
            }
        
        字段说明:
            type: 0-文件, 1-文件夹
            category: 文件分类，0-未知, 1-音频, 2-视频, 3-图片
            status: 文件审核状态，大于100为审核驳回文件
        
        Example:
            >>> result = await file_query.page(0, 1, 50, 
            ...                                  "file_name", "asc")
            >>> files = result["data"]["fileList"]
            >>> for file in files:
            ...     print(f"{file['filename']}: {file['size']} 字节")
        """
        params = {
            "parentFileId": parent_file_id,
            "page": page,
            "limit": limit,
            "orderBy": order_by,
            "orderDirection": order_direction
        }
        if trashed is not None:
            params["trashed"] = trashed
        if search_data is not None:
            params["searchData"] = search_data
        
        return await self._send_request(
            API_PATHS.file_list,
            params=params
        )
