# rename_from_list.py
from pathlib import Path
import sys
import re
import csv

ALLOWED_EXTS = {".webp", ".jpg", ".jpeg", ".png", ".gif", ".bmp", ".tiff"}

def slugify(text: str) -> str:
    # ubah ke slug aman untuk nama file
    text = text.strip().lower()
    text = re.sub(r"[^\w\s-]", "", text, flags=re.UNICODE)  # hapus simbol
    text = re.sub(r"\s+", "-", text).strip("-")             # spasi -> "-"
    text = re.sub(r"-{2,}", "-", text)                      # rapikan "--"
    return text or "untitled"

def ensure_unique(path: Path) -> Path:
    if not path.exists():
        return path
    stem = path.stem
    suffix = path.suffix
    parent = path.parent
    i = 1
    while True:
        candidate = parent / f"{stem}-{i}{suffix}"
        if not candidate.exists():
            return candidate
        i += 1

def read_list(list_file: Path):
    lines = []
    with list_file.open("r", encoding="utf-8") as f:
        for line in f:
            line = line.strip()
            if line:
                lines.append(line)
    return lines

def main():
    # Argumen: folder, list.txt (opsional)
    try:
        folder = Path(sys.argv[1])
    except IndexError:
        folder = Path.cwd()

    try:
        list_path = Path(sys.argv[2])
    except IndexError:
        list_path = folder / "list.txt"

    if not folder.exists():
        print(f"Folder tidak ditemukan: {folder}")
        sys.exit(1)
    if not list_path.exists():
        print(f"File list.txt tidak ditemukan: {list_path}")
        sys.exit(1)

    # Ambil file gambar & urutkan alfabetis
    files = sorted([p for p in folder.iterdir()
                    if p.is_file() and p.suffix.lower() in ALLOWED_EXTS],
                   key=lambda p: p.name.lower())

    names = [slugify(n) for n in read_list(list_path)]

    if not files:
        print("Tidak ada file gambar yang cocok di folder ini.")
        sys.exit(0)

    if not names:
        print("list.txt kosong.")
        sys.exit(0)

    # Potong sesuai jumlah yang tersedia
    if len(names) < len(files):
        print(f"PERINGATAN: nama di list hanya {len(names)} "
              f"untuk {len(files)} file. Hanya {len(names)} file pertama yang di-rename.")
        files = files[:len(names)]
    elif len(names) > len(files):
        print(f"PERINGATAN: list berisi {len(names)} nama tapi hanya ada {len(files)} file. "
              f"Nama sisanya akan diabaikan.")

    log_path = folder / "renamed_log.csv"
    with log_path.open("w", newline="", encoding="utf-8") as logf:
        writer = csv.writer(logf)
        writer.writerow(["old_name", "new_name"])
        for src, new_stem in zip(files, names):
            dst = ensure_unique(folder / f"{new_stem}{src.suffix.lower()}")
            src.rename(dst)
            writer.writerow([src.name, dst.name])
            print(f"{src.name}  ->  {dst.name}")

    print(f"\nSelesai. Log perubahan: {log_path}")

if __name__ == "__main__":
    main()
