# -*- coding: utf-8 -*-
import os
import sys
import argparse
from datetime import datetime

BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
sys.path.append(BASE_DIR)

from db import get_conn
from services.cafe24_cdn_service import upload_header_image_to_cafe24


def log(msg):
    print(f"[{datetime.now().strftime('%Y-%m-%d %H:%M:%S')}] {msg}", flush=True)


def fetch_pending(conn, article_no="", limit=10):
    sql = """
        SELECT *
        FROM blog_cdn_assets
        WHERE status IN ('pending', 'failed')
    """
    params = []

    if article_no:
        sql += " AND article_no = %s "
        params.append(str(article_no))

    sql += " ORDER BY id ASC LIMIT %s "
    params.append(int(limit))

    with conn.cursor() as cur:
        cur.execute(sql, params)
        return cur.fetchall()


def update_asset(conn, asset_id, status, cdn_url="", remote_path="", error_message=""):
    data = {
        "status": status,
        "error_message": error_message[:1000] if error_message else None,
        "updated_at": datetime.now(),
    }

    if cdn_url:
        data["cdn_url"] = cdn_url

    if remote_path:
        data["remote_path"] = remote_path

    if status == "uploaded":
        data["uploaded_at"] = datetime.now()

    sets = ", ".join([f"{k}=%s" for k in data.keys()])
    values = list(data.values())
    values.append(asset_id)

    with conn.cursor() as cur:
        cur.execute(f"UPDATE blog_cdn_assets SET {sets} WHERE id=%s", values)

    conn.commit()


def main():
    parser = argparse.ArgumentParser()
    parser.add_argument("--article-no", default="")
    parser.add_argument("--limit", type=int, default=10)
    args = parser.parse_args()

    conn = get_conn()

    try:
        rows = fetch_pending(conn, article_no=args.article_no, limit=args.limit)
        log(f"TARGET {len(rows)}")

        ok = 0
        fail = 0

        for row in rows:
            asset_id = row["id"]
            article_no = row["article_no"]
            local_path = row["local_path"]
            filename = row.get("file_name") or os.path.basename(local_path)

            log(f"UPLOAD START id={asset_id}, article_no={article_no}")

            try:
                result = upload_header_image_to_cafe24(
                    conn=conn,
                    article_no=article_no,
                    local_path=local_path,
                    filename=filename,
                )

                update_asset(
                    conn,
                    asset_id,
                    "uploaded",
                    cdn_url=result["cdn_url"],
                    remote_path=result["remote_path"],
                )

                log(f"UPLOAD OK {result['cdn_url']}")
                ok += 1

            except Exception as e:
                update_asset(conn, asset_id, "failed", error_message=str(e))
                log(f"UPLOAD FAIL {e}")
                fail += 1

        log(f"DONE ok={ok}, fail={fail}")

    finally:
        conn.close()


if __name__ == "__main__":
    main()
