#!/usr/bin/env python3
"""Rapikan berkas klien yang sudah berhenti: pindahkan ke arsip (bukan dihapus).

Pakai: python3 rapikan_klien_putus.py          (lihat rencana)
       python3 rapikan_klien_putus.py --go     (pindahkan)
"""
import glob, os, shutil, sys, time

WS = "/home/mantapman/.hermes/profiles/atun/workspace"
ARSIP = f"{WS}/arsip_klien_putus/20261014"
GO = "--go" in sys.argv

# kata kunci nama berkas milik klien yang sudah berhenti
KATA = ["leit", "nucleasoft", "nucleas", "ekaduta", "pamekasan", "otomasibisnis", "otomasi_bisnis",
        "obp_", "metamorf", "soto", "pak_otto", "warungpakotto", "merr", "everybe", "yasma"]
# berkas yang HARUS tetap (klien aktif atau dipakai bersama)
JANGAN = ["cfg_rsia.py"]


def isi_domain(berkas):
    try:
        t = open(berkas, encoding="utf-8", errors="replace").read(3000).lower()
    except Exception:
        return ""
    for d in ("kendangsari", "arek", "pamekasan", "areklancor"):
        if d in t:
            return d
    return ""


kandidat = []
for pola in (f"{WS}/*", f"{WS}/*/*"):
    for p in glob.glob(pola):
        nama = os.path.basename(p).lower()
        if os.path.isdir(p) and os.path.basename(p) in ("arsip_klien_putus", "cache", "drafts",
                                                        "memory", "catatan", "scripts", ".git"):
            continue
        if os.path.basename(p) in JANGAN:
            continue
        if any(k in nama for k in KATA):
            if os.path.isfile(p) and os.path.basename(p).startswith("cfg_"):
                dom = isi_domain(p)
                if dom and dom not in ("pamekasan",):
                    print(f"   DILEWATI (klien aktif: {dom}) · {os.path.basename(p)}")
                    continue
            kandidat.append(p)

def ukuran_path(p):
    if os.path.isfile(p):
        return os.path.getsize(p)
    return sum(os.path.getsize(os.path.join(r, f)) for r, _, fs in os.walk(p) for f in fs)


BATAS_MEDIA = 20 * 1024 * 1024   # 20 MB — di atas ini dianggap media, dibiarkan di tempatnya

kecil, media = [], []
for p in kandidat:
    rel = p.replace(WS + "/", "")
    # apa pun di dalam openclaw-img/ dibiarkan: itu akar URL publik media
    if rel.startswith("openclaw-img/") or "/openclaw-img/" in rel:
        media.append(p)
        continue
    (kecil if ukuran_path(p) <= BATAS_MEDIA else media).append(p)
kandidat = kecil

print(f"\n{len(kandidat)} berkas kecil siap dipindah · {sum(ukuran_path(p) for p in kandidat) // 1024} KB")
for p in sorted(kandidat)[:20]:
    print(f"   {p.replace(WS + '/', '')}")

print(f"\n{len(media)} folder media DIBIARKAN (di atas 20 MB, agar URL publik tidak rusak):")
for p in sorted(media):
    print(f"   {ukuran_path(p) // 1024 // 1024} MB · {p.replace(WS + '/', '')}")

if GO:
    os.makedirs(ARSIP, exist_ok=True)
    # buang berkas yang berada di dalam folder yang juga ikut dipindah
    kandidat = sorted(kandidat, key=len)
    bersih = []
    for p in kandidat:
        if any(p.startswith(q + os.sep) for q in bersih):
            continue
        bersih.append(p)
    kandidat = bersih
    pindah, gagal = [], []
    for p in kandidat:
        try:
            tujuan = os.path.join(ARSIP, os.path.basename(p))
            if os.path.exists(tujuan):
                tujuan += f"-{int(time.time())}"
            shutil.move(p, tujuan)
            pindah.append(os.path.basename(p))
        except Exception as e:
            gagal.append(f"{os.path.basename(p)} ({str(e)[:50]})")
    with open(f"{ARSIP}/DAFTAR.txt", "w") as f:
        f.write("Berkas klien yang sudah berhenti, dipindahkan 14 Okt 2026.\n")
        f.write("Asalnya: workspace/. Tidak dihapus — bisa dikembalikan.\n\n")
        f.write("\n".join(pindah))
    print(f"\n✅ {len(pindah)} berkas dipindahkan · gagal {len(gagal)}")
    for g in gagal[:5]:
        print(f"   gagal: {g}")
    print("   daftar: arsip_klien_putus/20261014/DAFTAR.txt")
else:
    print("\n(uji — pakai --go untuk memindahkan ke arsip)")
