"""
GitCode 仓库API
"""
from typing import Any, Dict, List, Optional, Union

from ..base.client import BaseAPI


class RepositoryAPI(BaseAPI):
    """仓库API"""
    
    async def list_user_repos(self, visibility: Optional[str] = None, sort: Optional[str] = None) -> List[Dict[str, Any]]:
        """
        获取当前用户的仓库列表
        
        Args:
            visibility: 仓库可见性过滤 ('all'|'public'|'private')
            sort: 排序方式 ('created'|'updated'|'pushed'|'full_name')
            
        Returns:
            仓库列表
        """
        params = {
            "visibility": visibility,
            "sort": sort,
        }
        return await self.request("GET", "/user/repos", params=params)
    
    async def get_repo(self, owner: str, repo: str) -> Dict[str, Any]:
        """
        获取特定仓库的详细信息
        
        Args:
            owner: 仓库所有者
            repo: 仓库名称
            
        Returns:
            仓库信息
        """
        return await self.request("GET", f"/repos/{owner}/{repo}")
    
    async def create_repo(
        self, 
        name: str, 
        description: str = "", 
        private: bool = False,
        has_issues: bool = True,
        has_wiki: bool = True,
        auto_init: bool = False,
        gitignore_template: Optional[str] = None,
        license_template: Optional[str] = None
    ) -> Dict[str, Any]:
        """
        创建新仓库
        
        Args:
            name: 仓库名称
            description: 仓库描述
            private: 是否为私有仓库
            has_issues: 是否启用Issues
            has_wiki: 是否启用Wiki
            auto_init: 是否自动初始化仓库(创建README)
            gitignore_template: gitignore模板名称
            license_template: 许可证模板名称
            
        Returns:
            创建的仓库信息
        """
        data = {
            "name": name,
            "description": description,
            "private": private,
            "has_issues": has_issues,
            "has_wiki": has_wiki,
            "auto_init": auto_init,
            "gitignore_template": gitignore_template,
            "license_template": license_template
        }
        return await self.request("POST", "/user/repos", data=data)
    
    async def update_repo(
        self,
        owner: str,
        repo: str,
        name: Optional[str] = None,
        description: Optional[str] = None,
        private: Optional[bool] = None,
        has_issues: Optional[bool] = None,
        has_wiki: Optional[bool] = None,
        default_branch: Optional[str] = None
    ) -> Dict[str, Any]:
        """
        更新仓库信息
        
        Args:
            owner: 仓库所有者
            repo: 仓库名称
            name: 新的仓库名称
            description: 新的仓库描述
            private: 是否为私有仓库
            has_issues: 是否启用Issues
            has_wiki: 是否启用Wiki
            default_branch: 默认分支
            
        Returns:
            更新后的仓库信息
        """
        data = {k: v for k, v in {
            "name": name,
            "description": description,
            "private": private,
            "has_issues": has_issues,
            "has_wiki": has_wiki,
            "default_branch": default_branch
        }.items() if v is not None}
        
        return await self.request("PATCH", f"/repos/{owner}/{repo}", data=data)
    
    async def delete_repo(self, owner: str, repo: str) -> None:
        """
        删除仓库
        
        Args:
            owner: 仓库所有者
            repo: 仓库名称
        """
        await self.request("DELETE", f"/repos/{owner}/{repo}")
    
    async def list_collaborators(self, owner: str, repo: str) -> List[Dict[str, Any]]:
        """
        列出仓库协作者
        
        Args:
            owner: 仓库所有者
            repo: 仓库名称
            
        Returns:
            协作者列表
        """
        return await self.request("GET", f"/repos/{owner}/{repo}/collaborators")
    
    async def add_collaborator(self, owner: str, repo: str, username: str, permission: str = "push") -> Dict[str, Any]:
        """
        添加协作者
        
        Args:
            owner: 仓库所有者
            repo: 仓库名称
            username: 用户名
            permission: 权限级别 ('pull'|'push'|'admin')
            
        Returns:
            邀请信息
        """
        data = {"permission": permission}
        return await self.request("PUT", f"/repos/{owner}/{repo}/collaborators/{username}", data=data)
    
    async def remove_collaborator(self, owner: str, repo: str, username: str) -> None:
        """
        移除协作者
        
        Args:
            owner: 仓库所有者
            repo: 仓库名称
            username: 用户名
        """
        await self.request("DELETE", f"/repos/{owner}/{repo}/collaborators/{username}")
    
    async def get_readme(self, owner: str, repo: str, ref: Optional[str] = None) -> Dict[str, Any]:
        """
        获取仓库README
        
        Args:
            owner: 仓库所有者
            repo: 仓库名称
            ref: 分支或提交SHA
            
        Returns:
            README文件信息
        """
        params = {"ref": ref} if ref else None
        return await self.request("GET", f"/repos/{owner}/{repo}/readme", params=params)
    
    async def get_contents(self, owner: str, repo: str, path: str, ref: Optional[str] = None) -> Union[Dict[str, Any], List[Dict[str, Any]]]:
        """
        获取仓库内容
        
        Args:
            owner: 仓库所有者
            repo: 仓库名称
            path: 文件或目录路径
            ref: 分支或提交SHA
            
        Returns:
            文件内容或目录列表
        """
        params = {"ref": ref} if ref else None
        return await self.request("GET", f"/repos/{owner}/{repo}/contents/{path}", params=params)
    
    async def create_file(
        self,
        owner: str,
        repo: str,
        path: str,
        message: str,
        content: str,
        branch: Optional[str] = None,
        committer: Optional[Dict[str, str]] = None,
        author: Optional[Dict[str, str]] = None
    ) -> Dict[str, Any]:
        """
        创建文件
        
        Args:
            owner: 仓库所有者
            repo: 仓库名称
            path: 文件路径
            message: 提交消息
            content: 文件内容(Base64编码)
            branch: 分支名
            committer: 提交者信息 {'name': '名称', 'email': '邮箱'}
            author: 作者信息 {'name': '名称', 'email': '邮箱'}
            
        Returns:
            提交信息
        """
        data = {
            "message": message,
            "content": content,
            "branch": branch,
            "committer": committer,
            "author": author
        }
        data = {k: v for k, v in data.items() if v is not None}
        
        return await self.request("PUT", f"/repos/{owner}/{repo}/contents/{path}", data=data)
    
    async def update_file(
        self,
        owner: str,
        repo: str,
        path: str,
        message: str,
        content: str,
        sha: str,
        branch: Optional[str] = None,
        committer: Optional[Dict[str, str]] = None,
        author: Optional[Dict[str, str]] = None
    ) -> Dict[str, Any]:
        """
        更新文件
        
        Args:
            owner: 仓库所有者
            repo: 仓库名称
            path: 文件路径
            message: 提交消息
            content: 文件内容(Base64编码)
            sha: 文件的当前SHA
            branch: 分支名
            committer: 提交者信息 {'name': '名称', 'email': '邮箱'}
            author: 作者信息 {'name': '名称', 'email': '邮箱'}
            
        Returns:
            提交信息
        """
        data = {
            "message": message,
            "content": content,
            "sha": sha,
            "branch": branch,
            "committer": committer,
            "author": author
        }
        data = {k: v for k, v in data.items() if v is not None}
        
        return await self.request("PUT", f"/repos/{owner}/{repo}/contents/{path}", data=data)
    
    async def delete_file(
        self,
        owner: str,
        repo: str,
        path: str,
        message: str,
        sha: str,
        branch: Optional[str] = None,
        committer: Optional[Dict[str, str]] = None,
        author: Optional[Dict[str, str]] = None
    ) -> Dict[str, Any]:
        """
        删除文件
        
        Args:
            owner: 仓库所有者
            repo: 仓库名称
            path: 文件路径
            message: 提交消息
            sha: 文件的当前SHA
            branch: 分支名
            committer: 提交者信息 {'name': '名称', 'email': '邮箱'}
            author: 作者信息 {'name': '名称', 'email': '邮箱'}
            
        Returns:
            提交信息
        """
        data = {
            "message": message,
            "sha": sha,
            "branch": branch,
            "committer": committer,
            "author": author
        }
        data = {k: v for k, v in data.items() if v is not None}
        
        return await self.request("DELETE", f"/repos/{owner}/{repo}/contents/{path}", data=data)