import subprocess
import re
from collections import defaultdict

# === 要掃描的資料夾 ===
paths = [
    r"\\192.168.99.205\14tb_限制級留存\限制級留存",
    r"\\192.168.99.205\18tb_限制級",
    r"\\10.1.1.16\Docker",
    r"D:\限制級",
    r"F:\20230805",
    r"E:\bt",
    r"G:\ ",
]

# 一般代碼模式 (如 H0930 ki240109, JNC4764C, 91CM-069)
general_pattern = re.compile(
    r'([A-Za-z0-9]+-[A-Za-z0-9]+|[A-Za-z0-9]+\s+[A-Za-z0-9]+|[A-Za-z]{2,}\d+[A-Za-z]*)',
    re.IGNORECASE
)

# FC2 / FCT 模式
fc2_pattern = re.compile(
    r'^(FC2|FCT)-PPV-(\d+)(?:[-_ ]?(?:\d+|part\d+|cd\d+))?',
    re.IGNORECASE
)

# Tokyo-Hot 模式
tokyo_pattern = re.compile(
    r'^(Tokyo-Hot)-([a-z]?\d+)(?:[-_ ]?(?:\d+|part\d+|cd\d+))?',
    re.IGNORECASE
)

# 格式：codes[compare_key] = [(path, folder_name)]
codes = defaultdict(list)


def get_folders_from_path(path):
    """使用 PowerShell 取得子資料夾名稱"""
    ps_command = f'dir "{path}" | Select-Object -ExpandProperty Name | Sort-Object'
    result = subprocess.run(
        ["powershell", "-Command", ps_command],
        capture_output=True,
        text=True,
        encoding="mbcs",
        errors="ignore"
    )
    if result.returncode != 0:
        raise RuntimeError(result.stderr.strip() or "PowerShell 執行失敗")
    return [line.strip() for line in result.stdout.splitlines() if line.strip()]


def extract_code(name):
    """依序嘗試各種編號格式，回傳 compare_key 與 main_code"""
    name = name.strip()

    # FC2 / FCT
    m = fc2_pattern.match(name)
    if m:
        main_code = f"{m.group(1).upper()}-PPV-{m.group(2)}"
        return main_code.lower(), main_code

    # Tokyo-Hot
    m = tokyo_pattern.match(name)
    if m:
        main_code = f"{m.group(1)}-{m.group(2)}"
        return main_code.lower(), main_code

    # 一般格式
    m = general_pattern.search(name)
    if m:
        main_code = m.group(1)
        return main_code.lower(), main_code

    return None, None


# === 掃描每個路徑 ===
for path in paths:
    try:
        folders = get_folders_from_path(path)
        print(f"✅ 掃描 {path} - 共 {len(folders)} 個項目")

        for name in folders:
            compare_key, main_code = extract_code(name)
            if compare_key:
                codes[compare_key].append((path, name))

    except Exception as e:
        print(f"⚠️ 無法存取 {path}: {e}")

# === 報告：跨路徑重複 ===
print("\n=== 🔁 跨路徑重複編號列表 ===")
cross_dup_found = False

for code, entries in codes.items():
    unique_paths = {p for p, _ in entries}
    if len(unique_paths) > 1:
        cross_dup_found = True
        print(f"\n🔁 {code} 出現在 {len(unique_paths)} 條路徑：")
        for path, folder in entries:
            print(f"  [{path}] {folder}")

if not cross_dup_found:
    print("✔️ 沒有跨路徑重複編號")


# === 報告：單一路徑內重複 ===
print("\n=== 🔂 同一路徑內重複編號列表 ===")
same_path_dup_found = False

for code, entries in codes.items():
    path_count = defaultdict(list)

    for path, folder in entries:
        path_count[path].append(folder)

    for path, items in path_count.items():
        if len(items) > 1:
            same_path_dup_found = True
            print(f"\n🔂 {code} 在 {path} 出現 {len(items)} 次：")
            for folder in items:
                print(f"  {folder}")

if not same_path_dup_found:
    print("✔️ 沒有同一路徑重複編號")

print("\n=== 比對完成 ===")
