#!/usr/bin/env python3
"""Consume approved PostgreSQL queue items with the visible XHS image publisher."""

from __future__ import annotations

import argparse
import json

import db
from xhs_publisher import PauseRequired, XiaohongshuImagePublisher, image_paths


def run_once(database_url: str, execute: bool) -> dict:
    item = db.claim_publish_item(database_url)
    if not item:
        return {"status": "空队列"}
    queue_id = int(item["id"])
    task_id = item["task_id"]
    task = db.get_task(task_id, database_url)
    try:
        if not task:
            raise ValueError(f"task not found: {task_id}")
        if task.get("status") != "已确认":
            raise ValueError("队列任务不是已确认状态")
        # Validate files before opening the browser so a bad queue item is clear.
        image_paths(task)
        publisher = XiaohongshuImagePublisher(database_url)
        try:
            result = publisher.prepare(task, publish=execute, confirm_publish=execute)
        finally:
            publisher.close()
        if execute:
            db.finish_publish_item(queue_id, "已发布", value=database_url)
            db.mark_task_published(task_id, database_url)
        else:
            db.finish_publish_item(queue_id, "暂停", error="已准备页面，等待显式执行发布", value=database_url)
        return result
    except PauseRequired as exc:
        db.finish_publish_item(queue_id, "暂停", error=str(exc), value=database_url)
        return {"task_id": task_id, "status": "暂停", "message": str(exc)}
    except Exception as exc:
        db.finish_publish_item(queue_id, "失败", error=str(exc), value=database_url)
        return {"task_id": task_id, "status": "失败", "message": str(exc)}


def main() -> None:
    parser = argparse.ArgumentParser(description="消费审核通过的小红书图文发布队列")
    parser.add_argument("--database-url", default="")
    parser.add_argument("--execute", action="store_true", help="允许点击真实发布控件")
    args = parser.parse_args()
    print(json.dumps(run_once(args.database_url, args.execute), ensure_ascii=False, indent=2))


if __name__ == "__main__":
    main()
