# 批量重命名 · 命令行版 · 课堂演示件
#
# 用法：先运行 第12章演示_生成测试文件夹.py，再运行本文件。
#
# 本文件分为两段：上半段是逻辑，下半段是命令行外壳。
# 窗口版会把上半段原样抄过去，一个字都不改，只换掉下半段。

from pathlib import Path

# ==================== 逻辑区 · 换壳时一行都不要动 ====================


def preview_rename(folder, prefix):
    """预演：算出每个文件将要改成什么名字。
    返回一份清单，每一项是（原路径, 新路径）。本函数不改动任何文件。"""
    plan = []
    number = 0
    for old in sorted(p for p in Path(folder).iterdir() if p.is_file()):
        # 只处理图片，其余文件跳过
        if old.suffix.lower() not in ['.jpg', '.png']:
            continue
        number = number + 1
        new = old.with_name(prefix + '_' + str(number).zfill(3) + old.suffix.lower())
        # 目标名称已被占用时，在末尾追加 -2
        if new.exists() and new != old:
            new = old.with_name(new.stem + '-2' + new.suffix)
        plan.append((old, new))
    return plan


def do_rename(plan, on_progress=None):
    """执行：按清单真正改名，返回成功的条数。
    每改完一个就调用一次 on_progress，由外壳自己决定怎么显示进度。
    出错时不作处理，直接抛出，由外壳决定怎么告诉使用者。"""
    done = 0
    for old, new in plan:
        old.rename(new)
        done = done + 1
        if on_progress is not None:
            on_progress(done, len(plan))
    return done


# ==================== 命令行外壳 · 窗口版会把这一段整个换掉 ====================


def print_progress(done, total):
    """命令行的进度显示方式：直接打印一行"""
    print('  已处理', done, '/', total)


if __name__ == '__main__':
    FOLDER = '测试文件夹'
    PREFIX = '课堂照片'

    folder = Path(__file__).with_name(FOLDER)
    plan = preview_rename(folder, PREFIX)

    print('预演结果，共', len(plan), '个文件将被改名：')
    for old, new in plan:
        print('  ', old.name, '→', new.name)

    answer = input('确认执行请输入 y，直接回车取消：')
    if answer.strip().lower() == 'y':
        done = do_rename(plan, print_progress)
        print('完成，共改名', done, '个文件。')
    else:
        print('已取消，没有改动任何文件。')

    input('按回车键结束')
