#!/usr/bin/env python3
"""
文件批量重命名工具
批量重命名指定目录下的文件，支持正则表达式替换
"""

import os
import re
import argparse
from pathlib import Path

__version__ = "1.0.0"
__author__ = "ScriptsHub"


def rename_files(directory, pattern, replacement, dry_run=False):
    """
    批量重命名文件

    Args:
        directory: 目标目录
        pattern: 正则表达式模式
        replacement: 替换字符串
        dry_run: 是否为演示模式（不实际重命名）

    Returns:
        成功重命名的文件数量
    """
    count = 0
    path = Path(directory)

    if not path.exists():
        print(f"错误: 目录 '{directory}' 不存在")
        return 0

    print(f"扫描目录: {directory}")
    print(f"匹配模式: {pattern}")
    print(f"替换为: {replacement}")
    print(f"模式: {'演示模式' if dry_run else '执行模式'}")
    print("-" * 50)

    for file_path in path.iterdir():
        if file_path.is_file():
            old_name = file_path.name
            new_name = re.sub(pattern, replacement, old_name)

            if old_name != new_name:
                new_path = file_path.parent / new_name
                print(f"{old_name} -> {new_name}")

                if not dry_run:
                    try:
                        file_path.rename(new_path)
                        count += 1
                    except Exception as e:
                        print(f"  错误: {e}")
                else:
                    count += 1

    print("-" * 50)
    print(f"{'将会' if dry_run else '已'}重命名 {count} 个文件")
    return count


def main():
    parser = argparse.ArgumentParser(
        description="批量重命名文件工具",
        formatter_class=argparse.RawDescriptionHelpFormatter,
        epilog="""
示例:
  %(prog)s /path/to/dir "\.txt$" ".md"           # 将 .txt 改为 .md
  %(prog)s /path/to/dir "^old" "new"             # 将 old 开头改为 new
  %(prog)s /path/to/dir "\\s+" "_" --dry-run     # 将空格替换为下划线（演示）
        """
    )

    parser.add_argument('directory', help='目标目录路径')
    parser.add_argument('pattern', help='正则表达式匹配模式')
    parser.add_argument('replacement', help='替换字符串')
    parser.add_argument('-d', '--dry-run', action='store_true',
                       help='演示模式，不实际重命名文件')
    parser.add_argument('-v', '--version', action='version',
                       version=f'%(prog)s {__version__}')

    args = parser.parse_args()

    # 执行重命名
    rename_files(args.directory, args.pattern, args.replacement, args.dry_run)


if __name__ == '__main__':
    main()
