from dataclasses import dataclass
from typing import Literal


@dataclass(frozen=True)
class CompletionShellSpec:
    """
    Shell completion 元数据定义。

    name: shell 名称
    description: shell 描述文本
    generator: 脚本生成方式
    default_target: 默认脚本落盘路径，相对于用户 home 目录
    default_rc_file: 默认 rc 文件路径，相对于用户 home 目录
    auto_discovery: 是否会被 shell 自动发现
    supported: 当前版本是否已支持
    """

    name: str
    description: str
    generator: Literal['click', 'custom', 'unsupported']
    default_target: str
    default_rc_file: str | None
    auto_discovery: bool
    supported: bool


@dataclass(frozen=True)
class CompletionShellSpecRegistry:
    """
    completion shell 元数据注册表。

    该注册表集中维护 CLI 当前支持的 shell completion 元数据，
    供 installer、doctor 和 provider 等场景统一查询。

    :param specs: 按 shell 名称索引的元数据表
    """

    specs: dict[str, CompletionShellSpec]

    def get_spec(self, shell_name: str) -> CompletionShellSpec | None:
        """
        获取指定 shell 的 completion 元数据。

        :param shell_name: shell 名称
        :return: shell 元数据，不存在时返回 None
        """
        return self.specs.get(shell_name)

    def list_shell_names(self) -> list[str]:
        """
        获取已注册的 shell 名称列表。

        :return: shell 名称列表
        """
        return list(self.specs)


DEFAULT_COMPLETION_SHELL_SPECS: dict[str, CompletionShellSpec] = {
    'bash': CompletionShellSpec(
        name='bash',
        description='GNU Bash shell completion',
        generator='click',
        default_target='.local/share/shierfeng/completion/shierfeng.bash',
        default_rc_file='.bashrc',
        auto_discovery=False,
        supported=True,
    ),
    'zsh': CompletionShellSpec(
        name='zsh',
        description='Zsh shell completion',
        generator='click',
        default_target='.local/share/shierfeng/completion/shierfeng.zsh',
        default_rc_file='.zshrc',
        auto_discovery=False,
        supported=True,
    ),
    'fish': CompletionShellSpec(
        name='fish',
        description='Fish shell completion',
        generator='click',
        default_target='.config/fish/completions/shierfeng.fish',
        default_rc_file=None,
        auto_discovery=True,
        supported=True,
    ),
    'powershell': CompletionShellSpec(
        name='powershell',
        description='Windows PowerShell / PowerShell 7 completion',
        generator='custom',
        default_target='Documents/PowerShell/Profile/shierfeng.ps1',
        default_rc_file='Documents/PowerShell/Microsoft.PowerShell_profile.ps1',
        auto_discovery=False,
        supported=True,
    ),
}

COMPLETION_SHELL_SPEC_REGISTRY = CompletionShellSpecRegistry(specs=DEFAULT_COMPLETION_SHELL_SPECS)
