#!/usr/bin/env python3
"""扫描 html_logs/租房260630/ 下的照片/视频，生成缩略图和 media.json。

同时创建 html_logs/media/ 下的英文 slug 软链接，避免 URL 里出现中文路径。
"""
import json
import os
from pathlib import Path

from PIL import Image

BASE_DIR = Path(__file__).parent.resolve()  # html_logs/
MEDIA_SRC = BASE_DIR / "租房260630"
MEDIA_LINK = BASE_DIR / "media"

# 子目录名 -> comps.html 里使用的 slug
DIR_TO_SLUG = {
    "万北2-711": "wanquanzhuangbei-2-711",
    "万北4-310": "wanquanzhuangbei-4-310",
    "小南庄24": "xiaonanzhuang-24-762",
    "红5楼": "lixinhong-5-1-6",
    "三义庙": "sanyimiao-1ceng",
    "财智公馆G": "caizhihuiguan-G",
    "财智公馆3": "caizhihuiguan-3",
}

IMAGE_EXTS = {".jpg", ".jpeg", ".png", ".webp", ".gif"}
VIDEO_EXTS = {".mp4", ".mov", ".webm", ".mkv"}
THUMB_MAX_SIZE = 480
THUMB_QUALITY = 75


def ensure_symlinks():
    MEDIA_LINK.mkdir(exist_ok=True)
    for src_name, slug in DIR_TO_SLUG.items():
        src = MEDIA_SRC / src_name
        link = MEDIA_LINK / slug
        if not src.exists():
            print(f"警告：源目录不存在 {src}")
            continue
        if link.exists() or link.is_symlink():
            if link.is_symlink() and os.readlink(link) != os.path.relpath(src, MEDIA_LINK):
                link.unlink()
            else:
                continue
        link.symlink_to(os.path.relpath(src, MEDIA_LINK), target_is_directory=True)
        print(f"创建软链接 {link.name} -> {src_name}")


def ensure_thumbnail(src: Path, thumb: Path) -> bool:
    """生成缩略图，返回是否成功。"""
    if thumb.exists() and thumb.stat().st_mtime >= src.stat().st_mtime:
        return True
    try:
        thumb.parent.mkdir(exist_ok=True)
        with Image.open(src) as im:
            im.thumbnail((THUMB_MAX_SIZE, THUMB_MAX_SIZE), Image.LANCZOS)
            # 转换为 RGB，避免 RGBA 保存为 JPEG 时报错
            if im.mode in ("RGBA", "P"):
                im = im.convert("RGB")
            im.save(thumb, "JPEG", quality=THUMB_QUALITY, optimize=True)
        return True
    except Exception as e:
        print(f"  缩略图生成失败 {src}: {e}")
        return False


def build_media_json():
    data = {slug: {"images": [], "thumbnails": [], "videos": []} for slug in DIR_TO_SLUG.values()}

    for src_name, slug in DIR_TO_SLUG.items():
        src_dir = MEDIA_SRC / src_name
        if not src_dir.exists():
            continue
        for f in sorted(src_dir.iterdir()):
            if not f.is_file():
                continue
            # 跳过已生成的 thumbs 目录里的文件，避免重复索引
            if f.parent.name == "thumbs":
                continue
            rel = f"media/{slug}/{f.name}"
            ext = f.suffix.lower()
            if ext in IMAGE_EXTS:
                data[slug]["images"].append(rel)
                thumb_path = src_dir / "thumbs" / f.name
                if ensure_thumbnail(f, thumb_path):
                    data[slug]["thumbnails"].append(f"media/{slug}/thumbs/{f.name}")
                else:
                    # 缩略图失败时回退到原图
                    data[slug]["thumbnails"].append(rel)
            elif ext in VIDEO_EXTS:
                data[slug]["videos"].append(rel)

    out = BASE_DIR / "media.json"
    with open(out, "w", encoding="utf-8") as fp:
        json.dump(data, fp, ensure_ascii=False, indent=2)
    print(f"已生成 {out}")


if __name__ == "__main__":
    ensure_symlinks()
    build_media_json()
