"""
全角字符转半角字符工具脚本
用于将Python文件中的全角括号、逗号等字符转换为半角
"""
import sys
from pathlib import Path


def fullwidth_to_halfwidth(text: str) -> str:
    """
    将文本中的全角字符转换为半角字符

    Args:
        text: 输入文本

    Returns:
        转换后的文本
    """
    # 定义全角到半角的映射
    fullwidth_chars = {
        "（": "(",
        "）": ")",
        "，": ",",
        "；": ";",
        "：": ":",
        "。": ".",
        "？": "?",
        "！": "!",
        "＂": '"',
        "＇": "'",
        "［": "[",
        "］": "]",
        "｛": "{",
        "｝": "}",
        "　": " ",  # 全角空格
    }

    # 处理每个字符
    result = []
    for char in text:
        result.append(fullwidth_chars.get(char, char))

    return "".join(result)


def convert_file(file_path: Path) -> bool:
    """
    转换单个文件中的全角字符

    Args:
        file_path: 文件路径

    Returns:
        如果文件被修改则返回True，否则返回False
    """
    if not file_path.exists():
        print(f"文件不存在: {file_path}")
        return False

    if file_path.suffix != ".py":
        print(f"跳过非Python文件: {file_path}")
        return False

    # 忽略自身文件，防止无限循环
    if file_path.name == "fullwidth_to_halfwidth_converter.py":
        print(f"跳过自身文件: {file_path}")
        return False

    # 读取原始内容
    with open(file_path, encoding="utf-8") as f:
        original_content = f.read()

    # 转换全角字符
    converted_content = fullwidth_to_halfwidth(original_content)

    # 如果内容发生了变化，则写回文件
    if original_content != converted_content:
        print(f"转换文件: {file_path}")
        with open(file_path, "w", encoding="utf-8") as f:
            f.write(converted_content)
        return True

    return False


def convert_files_in_directory(directory: Path, pattern: str = "*.py") -> int:
    """
    转换目录下所有匹配模式的文件

    Args:
        directory: 目录路径
        pattern: 文件匹配模式

    Returns:
        修改的文件数量
    """
    if not directory.exists():
        print(f"目录不存在: {directory}")
        return 0

    python_files = list(directory.rglob(pattern))
    modified_count = 0

    for file_path in python_files:
        if convert_file(file_path):
            modified_count += 1

    return modified_count


def main():
    """主函数，处理命令行参数"""
    if len(sys.argv) < 2:
        print("使用示例:")
        print("  处理单个文件: python fullwidth_to_halfwidth_converter.py ./main.py")
        print("  处理多个文件: python fullwidth_to_halfwidth_converter.py "
              "file1.py file2.py file3.py")
        print("  处理整个目录: python fullwidth_to_halfwidth_converter.py ./src")
        sys.exit(1)

    modified_count = 0
    total_files = 0

    # 处理所有传入的路径参数（支持多文件和目录）
    for path_arg in sys.argv[1:]:
        target_path = Path(path_arg)

        if target_path.is_file():
            # 处理单个文件
            total_files += 1
            if convert_file(target_path):
                modified_count += 1
        elif target_path.is_dir():
            # 处理目录下的所有Python文件
            pattern = "*.py"
            dir_modified = convert_files_in_directory(target_path, pattern)
            modified_count += dir_modified
            # 统计目录中的文件数
            total_files += len(list(target_path.rglob(pattern)))
        else:
            print(f"⚠️  路径不存在: {target_path}")

    # 输出处理结果
    if total_files > 0:
        print(f"✅ 处理完成: 共检查 {total_files} 个文件，转换了 {modified_count} 个文件")
    else:
        print("⚠️  没有找到需要处理的文件")

    # 如果有文件被修改，返回非零状态码，通知pre-commit需要重新暂存
    sys.exit(1 if modified_count > 0 else 0)


if __name__ == "__main__":
    main()
