#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""Login ulang Playwright ke DAS (fresh state) lalu touch-save beberapa post
dengan menekan tombol Save/Update. Mirip das_pw_touch_save.py tapi bisa multi-PID
dan auto-login ulang."""
import sys, json, time
from playwright.sync_api import sync_playwright

USER = "bambangbot"
APP_PW = "C00l_man&314554"  # password login biasa akun (bukan app password) — buat login wp-admin browser
STATE = "/tmp/das_state.json"

def goto_light(pg, url, max_wait=70):
    try:
        pg.goto(url, timeout=max_wait*1000, wait_until="commit")
    except Exception as e:
        print("  goto warn:", str(e)[:60])

def ensure_login(ctx, pg):
    goto_light(pg, "https://dasindonesia.com/wp-admin/", 70)
    for _ in range(30):
        if "wp-login" not in pg.url and "wp-admin" in pg.url:
            return True
        if pg.locator("#user_login").count() > 0:
            break
        pg.wait_for_timeout(3000)
    if pg.locator("#user_login").count() > 0:
        goto_light(pg, "https://dasindonesia.com/wp-login.php", 70)
        for _ in range(30):
            if pg.locator("#user_login").count() > 0:
                break
            pg.wait_for_timeout(3000)
        pg.fill("#user_login", USER)
        pg.fill("#user_pass", APP_PW)
        pg.click("#wp-submit", no_wait_after=True)
        for _ in range(50):  # max 150s
            pg.wait_for_timeout(3000)
            if "wp-login" not in pg.url and "wp-admin" in pg.url:
                ctx.storage_state(path=STATE)
                print("LOGIN_OK, state saved")
                return True
            if pg.locator("#login_error").count() > 0:
                print("LOGIN_ERROR:", pg.locator("#login_error").inner_text(timeout=2000)[:150])
                return False
        print("LOGIN_TIMEOUT url:", pg.url)
        return False
    return False

def touch_save(pg, pid, idx, total):
    url = f"https://dasindonesia.com/wp-admin/post.php?post={pid}&action=edit"
    goto_light(pg, url, 90)
    # tunggu editor & tombol publish muncul
    btn = None
    for _ in range(40):  # 120s
        pg.wait_for_timeout(3000)
        sb = pg.locator("button.editor-post-publish-button")
        if sb.count() > 0 and sb.first.is_visible():
            btn = sb.first
            break
        # fallback: tombol update di toolbar
        up = pg.locator("input[name='save']")
        if up.count() > 0:
            btn = up.first
            break
    if btn is None:
        print(f"[{idx}/{total}] PID {pid}: NO SAVE BUTTON (mungkin redirect login? url={pg.url[:60]})")
        return
    try:
        text = btn.inner_text(timeout=3000).strip()[:30]
    except Exception:
        text = ""
    btn.click(no_wait_after=True)
    print(f"[{idx}/{total}] PID {pid}: CLICKED Save/Update ('{text}')")
    # tunggu state saved / url kembali
    for _ in range(20):
        pg.wait_for_timeout(3000)
        st = pg.locator(".editor-post-saved-state").first
        if st.count() and st.inner_text(timeout=2000).strip() and "Saving" not in st.inner_text(timeout=2000):
            print(f"    -> saved state: {st.inner_text(timeout=2000).strip()[:40]}")
            break
        # cek tombol jadi 'Update' lagi = sudah tersimpan
        sb2 = pg.locator("button.editor-post-publish-button")
        if sb2.count() > 0 and "Update" in (sb2.first.inner_text(timeout=2000) or ""):
            break

def main():
    pids = [int(x) for x in sys.argv[1].split(",") if x.strip()]
    if not pids:
        print("usage: das_pw_touch_save_multi.py PID1,PID2,...")
        return 1
    with sync_playwright() as p:
        b = p.chromium.launch(headless=True, args=["--no-sandbox", "--disable-dev-shm-usage"])
        ctx = b.new_context(user_agent="Mozilla/5.0 (Windows NT 10.0; Win64; x64)")
        pg = ctx.new_page()
        if not ensure_login(ctx, pg):
            print("ABORT: login gagal"); b.close(); return 1
        for i, pid in enumerate(pids, 1):
            touch_save(pg, pid, i, len(pids))
            time.sleep(3)
        b.close()
    print("ALL_DONE")
    return 0

sys.exit(main())
