#!/usr/bin/env python3
"""Hapus jadwal DUPLIKAT (link sama dalam akun yang sama) — sisakan yang PALING AWAL, hapus yang terbaru."""
import sys, json, re, urllib.request
from collections import defaultdict
sys.path.insert(0, "/home/mantapman/.hermes/profiles/atun/workspace")
from repliz_client import HEADERS, BASE

c_holder = None
def get_pending():
    docs = []
    for p in range(1, 90):
        raw = urllib.request.Request(f"{BASE}/public/schedule?page={p}&limit=100", headers=HEADERS)
        with urllib.request.urlopen(raw, timeout=30) as r:
            docs.extend(json.load(r)["docs"])
    return [d for d in docs if (d.get('status') or '').lower() == 'pending']

def delete_schedule(sid):
    req = urllib.request.Request(f"{BASE}/public/schedule/{sid}", headers=HEADERS, method="DELETE")
    with urllib.request.urlopen(req, timeout=30) as r:
        return r.status

def med_sig(d):
    return tuple(m.get('url','').split('/')[-1] for m in (d.get('medias') or []))

pend = get_pending()
acc_name = {}
for d in pend:
    acc = d.get('account') or {}
    acc_name.setdefault(d.get('accountId'), acc.get('name') or d.get('accountId'))

# grup link duplikat per akun
link_by_acc = defaultdict(list)
for d in pend:
    desc = d.get('description') or ''
    for m in re.finditer(r'https?://(?:www\.)?(studiosoft|tslaw|theskincodeclinic|dasindonesia|everybeofficial|cnnindonesia|leitsurabaya)\.\S+', desc):
        u = m.group(0).rstrip('.,;!?)').rstrip('/')
        link_by_acc[d.get('accountId')].append((u, d))

to_delete = []
for accid, items in link_by_acc.items():
    seen = defaultdict(list)
    for u, d in items:
        seen[u].append(d)
    for u, occ in seen.items():
        if len(occ) > 1:
            # sisakan yang scheduleAt PALING AWAL; hapus sisanya (terbaru)
            occ_sorted = sorted(occ, key=lambda x: x.get('scheduleAt') or '')
            keep = occ_sorted[0]
            for dup in occ_sorted[1:]:
                # jangan hapus kalau media beda (bukan benar2 duplikat)
                if med_sig(dup) != med_sig(keep):
                    print(f"  ⏭️  {acc_name.get(accid, accid)}: media beda, skip — {dup['id']}")
                    continue
                to_delete.append((accid, keep, dup))

print(f"🔍 akan dihapus (duplikat terbaru): {len(to_delete)}\n")
for accid, keep, dup in sorted(to_delete, key=lambda x: x[1].get('scheduleAt') or ''):
    print(f"  KEEP  {keep.get('scheduleAt')} | {keep['id']}")
    print(f"  DEL   {dup.get('scheduleAt')} | {dup['id']} | {acc_name.get(accid, accid)} | {(dup.get('description') or '')[:60].replace(chr(10),' ')}")
    print()

if len(sys.argv) > 1 and sys.argv[1] == 'exec':
    print("=== EKSEKUSI DELETE ===")
    ok = fail = 0
    for accid, keep, dup in to_delete:
        try:
            delete_schedule(dup['id'])
            ok += 1
            print(f"  ✅ DEL {dup['id']} ({dup.get('scheduleAt')})")
        except Exception as e:
            fail += 1
            print(f"  ❌ {dup['id']}: {e}")
    print(f"\n📊 deleted: {ok} | gagal: {fail}")
else:
    print("(dry-run — jalankan dengan argumen 'exec' untuk menghapus)")
