# -*- coding: utf-8 -*-
"""
tools/migrate_character_assets.py
Tái cấu trúc và gom toàn bộ tài nguyên nhân vật (Chân dung Master/720p, Turnaround Sheet Master/720p, Views Crop)
vào thư mục riêng của từng nhân vật theo cấu trúc Character-Centric Architecture:
04_Assets/characters/<group>/<character_name>/
    ├── <character_name>_master.png
    ├── <character_name>_720p.png
    ├── <character_name>_turnaround_sheet_master.png
    ├── <character_name>_turnaround_sheet_720p.png
    └── views/
        ├── <character_name>_front.png
        └── <character_name>_portrait.png
"""

import os
import sys
import shutil
import hashlib
from pathlib import Path
from collections import defaultdict

sys.stdout.reconfigure(encoding='utf-8')

BASE_DIR = Path(__file__).resolve().parent.parent
CHARS_DIR = BASE_DIR / "04_Assets" / "characters"
TA_DIR = BASE_DIR / "04_Assets" / "turnaround_sheets"

def get_file_hash(p: Path) -> str:
    return hashlib.md5(p.read_bytes()).hexdigest()

def get_char_folder(filename: str, group_name: str) -> str:
    f = filename.lower()
    if 'thuy_kieu' in f:
        if 'ao_nau_song' in f: return 'thuy_kieu_ao_nau_song'
        if 'hoa_no' in f or 'servant' in f: return 'thuy_kieu_hoa_no_servant'
        if 'trieu_doanh' in f or 'general_wife' in f: return 'thuy_kieu_trieu_doanh_phu_nhan'
        return 'thuy_kieu_maiden_16yo'
    if 'kim_trong' in f:
        if 'mandarin' in f or '33yo' in f: return 'kim_trong_mandarin_33yo'
        if 'quan_gia' in f: return 'quan_gia_kim_trong'
        if 'tieu_dong' in f: return 'tieu_dong_kim_trong'
        return 'kim_trong_18yo'
    if 'thuy_van' in f:
        return 'thuy_van_maiden_16yo'
    if 'tu_hai' in f:
        if 'pho_tuong' in f: return 'pho_tuong_tu_hai'
        return 'tu_hai'
    if 'dam_tien' in f: return 'dam_tien'
    if 'gia_no_nu_vuong' in f: return 'gia_no_nu_vuong'
    if 'kim_attendants' in f: return 'kim_attendants'
    if 'quan_gia_vuong' in f: return 'quan_gia_vuong'
    if 'vuong_ba' in f: return 'vuong_ba_50yo'
    if 'vuong_ong' in f: return 'vuong_ong_55yo'
    if 'vuong_quan' in f: return 'vuong_quan_16yo'
    if 'vuong_servants' in f: return 'vuong_servants'
    if 'hoan_thu' in f: return 'hoan_thu'
    if 'thuc_sinh' in f: return 'thuc_sinh'
    if 'ma_giam_sinh' in f: return 'ma_giam_sinh'
    if 'so_khanh' in f: return 'so_khanh'
    if 'tu_ba' in f: return 'tu_ba'
    if 'ho_ton_hien' in f: return 'ho_ton_hien'
    if 'sai_nha' in f:
        if 'thang_ban_to' in f: return 'thang_ban_to_sai_nha'
        return 'sai_nha'
    if 'thang_ban_to' in f: return 'thang_ban_to'
    if 'giac_duyen' in f: return 'giac_duyen'
    if 'pho_tuong_tu_hai' in f: return 'pho_tuong_tu_hai'
    raise ValueError(f"Unknown character for file: {filename} in group: {group_name}")

def migrate():
    print("=" * 80)
    print("🚀 BẮT ĐẦU MIGRATION TÁI CẤU TRÚC ASSET NHÂN VẬT THEO CHARACTER-CENTRIC")
    print("=" * 80)

    # 1. Thu thập toàn bộ file hiện tại và tính checksum
    initial_files = {}
    
    # Files trong characters
    for p in CHARS_DIR.glob("**/*.*"):
        if p.is_file():
            initial_files[p] = ("char", get_file_hash(p))
            
    # Files trong turnaround_sheets
    if TA_DIR.exists():
        for p in TA_DIR.glob("**/*.*"):
            if p.is_file():
                initial_files[p] = ("ta", get_file_hash(p))

    print(f"[*] Tổng số file ban đầu cần di chuyển: {len(initial_files)} files")
    assert len(initial_files) == 125, f"Kỳ vọng 125 files, thực tế {len(initial_files)}"

    # 2. Xây dựng kế hoạch di chuyển
    moves = [] # list of (src_path, dest_path, expected_hash)
    
    for src_path, (src_type, file_hash) in initial_files.items():
        if src_type == "char":
            rel = src_path.relative_to(CHARS_DIR)
            group_name = rel.parts[0]
            char_folder = get_char_folder(src_path.name, group_name)
            dest_dir = CHARS_DIR / group_name / char_folder
            dest_path = dest_dir / src_path.name
        else: # "ta"
            rel = src_path.relative_to(TA_DIR)
            group_name = rel.parts[0]
            char_folder = get_char_folder(src_path.name, group_name)
            is_view = ("views" in rel.parts)
            if is_view:
                dest_dir = CHARS_DIR / group_name / char_folder / "views"
            else:
                dest_dir = CHARS_DIR / group_name / char_folder
            dest_path = dest_dir / src_path.name

        moves.append((src_path, dest_path, file_hash))

    # 3. Tạo các thư mục đích và thực hiện di chuyển
    print("\n[*] Đang thực hiện di chuyển và xác thực hash từng file...")
    temp_backup_dir = BASE_DIR / "04_Assets" / "_temp_migration_backup"
    temp_backup_dir.mkdir(parents=True, exist_ok=True)

    moved_count = 0
    for src_path, dest_path, file_hash in moves:
        dest_path.parent.mkdir(parents=True, exist_ok=True)
        if src_path == dest_path:
            continue
            
        # Copy to dest
        shutil.copy2(src_path, dest_path)
        
        # Verify hash
        dest_hash = get_file_hash(dest_path)
        if dest_hash != file_hash:
            raise RuntimeError(f"Hash mismatch for {dest_path}: {dest_hash} != {file_hash}")
        moved_count += 1

    print(f"[✓] Đã sao chép và xác minh tính toàn vẹn 100% cho {len(moves)} files đích!")

    # 4. Dọn dẹp các file phẳng cũ trong CHARS_DIR
    cleaned_old_chars = 0
    for group_dir in CHARS_DIR.iterdir():
        if group_dir.is_dir():
            for f in list(group_dir.glob("*.png")):
                if f.is_file():
                    f.unlink()
                    cleaned_old_chars += 1
    print(f"[✓] Đã dọn dẹp {cleaned_old_chars} file phẳng cũ trong các thư mục nhóm characters.")

    # 5. Xóa thư mục turnaround_sheets cũ
    if TA_DIR.exists():
        shutil.rmtree(TA_DIR)
        print(f"[✓] Đã xóa thư mục tách rời cũ: {TA_DIR}")

    # Dọn thư mục tạm nếu có
    if temp_backup_dir.exists():
        shutil.rmtree(temp_backup_dir)

    # 6. Kiểm tra lại toàn bộ file trong CHARS_DIR mới
    new_files = list(CHARS_DIR.glob("**/*.png"))
    print(f"\n[*] Kiểm tra tổng số file sau migration: {len(new_files)} files PNG")
    assert len(new_files) == 125, f"Tổng số file không khớp! Kỳ vọng 125, thực tế {len(new_files)}"

    print("=" * 80)
    print("🎉 MIGRATION HOÀN TẤT THÀNH CÔNG RỰC RỠ: 125/125 FILES TOÀN VẸN!")
    print("=" * 80)

if __name__ == "__main__":
    migrate()
