# -*- coding: utf-8 -*-

import os
import sys
import argparse
import subprocess
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.draft_validator import validate_draft

def fetch_target_article(conn, realtor_id=None, article_no=None, force=False):
    sql = """
        SELECT
            a.id,
            a.realtor_id,
            a.article_no,
            a.collect_status,

            COALESCE(s.auto_publish_enabled, 0) AS auto_publish_enabled,
            COALESCE(s.daily_post_limit, 1) AS daily_post_limit,
            COALESCE(s.min_image_count, 5) AS min_image_count,
            COALESCE(s.min_text_length, 1200) AS min_text_length,
            COALESCE(s.priority_order, 'latest') AS priority_order

        FROM blog_realtor_articles a

        LEFT JOIN blog_publish_settings s
            ON a.realtor_id = s.realtor_id

        WHERE 1=1
    """

    params = []

    if realtor_id:
        sql += " AND a.realtor_id = %s "
        params.append(realtor_id)

    if article_no:
        sql += " AND a.article_no = %s "
        params.append(str(article_no))

    if not force:
        sql += """
            AND NOT EXISTS (
                SELECT 1
                FROM blog_article_drafts d
                WHERE d.article_no = a.article_no
            )
        """

    sql += """
        ORDER BY a.created_at DESC, a.id DESC
        LIMIT 1
    """

    with conn.cursor() as cur:
        cur.execute(sql, params)
        return cur.fetchone()


def mark_article_pending(conn, article_id):
    with conn.cursor() as cur:
        cur.execute("""
            UPDATE blog_realtor_articles
            SET
                collect_status = 'pending',
                error_message = NULL,
                updated_at = NOW()
            WHERE id = %s
        """, (article_id,))

    conn.commit()


def delete_existing_draft(conn, article_no):
    with conn.cursor() as cur:
        cur.execute("""
            DELETE FROM blog_article_drafts
            WHERE article_no = %s
        """, (article_no,))

    conn.commit()


def run_job(script_path, args):
    cmd = [sys.executable, script_path] + args

    print("[COMMAND]", " ".join(cmd))

    result = subprocess.run(
        cmd,
        cwd=BASE_DIR,
        text=True,
    )

    if result.returncode != 0:
        raise Exception(f"job failed: {script_path}")


def get_image_count(conn, article_no):
    with conn.cursor() as cur:
        cur.execute("""
            SELECT COUNT(*) AS cnt
            FROM blog_realestate_article_images
            WHERE article_no = %s
        """, (article_no,))
        row = cur.fetchone()

    return int(row.get("cnt") or 0)


def get_draft_info(conn, article_no):
    with conn.cursor() as cur:
        cur.execute("""
            SELECT
                id,
                draft_title,
                draft_html,
                clipboard_html,
                plain_text,
                status
            FROM blog_article_drafts
            WHERE article_no = %s
            ORDER BY id DESC
            LIMIT 1
        """, (article_no,))

        return cur.fetchone()


def update_draft_status(conn, article_no, status, reason=None):
    with conn.cursor() as cur:
        cur.execute("""
            UPDATE blog_article_drafts
            SET
                status = %s,
                error_message = %s,
                updated_at = NOW()
            WHERE article_no = %s
        """, (
            status,
            reason or '',
            article_no
        ))

    conn.commit()


def process_article(conn, article, force=False):
    article_no = str(article["article_no"])
    realtor_id = int(article["realtor_id"])

    min_image_count = int(article.get("min_image_count") or 5)
    min_text_length = int(article.get("min_text_length") or 1200)

    print("-" * 80)
    print(f"[ARTICLE START] {article_no}")
    print(f"[REALTOR] {realtor_id}")
    print(f"[FORCE] {force}")

    if force:
        delete_existing_draft(conn, article_no)
        mark_article_pending(conn, article["id"])

    # 1. 상세/이미지 수집
    run_job(
        os.path.join("jobs", "collect_article_details_job.py"),
        [
            "--realtor-id",
            str(realtor_id),
            "--article-no",
            str(article_no),
            "--limit",
            "1",
        ]
    )

    # 1-1. 보조 이미지 자동 생성
    run_job(
        os.path.join("jobs", "generate_extra_image_candidates.py"),
        [
            "--realtor-id",
            str(realtor_id),
            "--article-no",
            str(article_no),
            "--force",
        ]
    )

    # 2. 블로그 초안 생성
    run_job(
        os.path.join("jobs", "generate_blog_drafts.py"),
        [
            "--realtor-id",
            str(realtor_id),
            "--article-no",
            str(article_no),
        ]
    )

    # 3. 초안 품질 자동 검수
    draft = get_draft_info(conn, article_no)

    if not draft:
        print(f"[DRAFT FAILED] {article_no}")
        return

    from services.draft_validator import validate_draft

    result = validate_draft(draft)

    status = result["status"]
    reason = (
        f"score={result['score']}, "
        f"images={result['image_count']}, "
        f"text={result['text_length']}, "
        f"reasons={','.join(result['reasons'])}"
    )

    update_draft_status(
        conn,
        article_no,
        status,
        reason
    )

    print(f"[VALIDATED] {article_no}")
    print(f"[STATUS] {status}")
    print(f"[REASON] {reason}")


def main():
    parser = argparse.ArgumentParser()

    parser.add_argument("--realtor-id", type=int, default=None)
    parser.add_argument("--article-no", type=str, default=None)
    parser.add_argument("--force", action="store_true")

    args = parser.parse_args()

    conn = get_conn()

    try:
        print("=" * 80)
        print("[START] process_one_article_pipeline")
        print("TIME:", datetime.now().strftime("%Y-%m-%d %H:%M:%S"))
        print("=" * 80)

        article = fetch_target_article(
            conn,
            realtor_id=args.realtor_id,
            article_no=args.article_no,
            force=args.force,
        )

        if not article:
            print("[NO TARGET ARTICLE]")
            print("[HINT] article_no 또는 realtor_id에 해당하는 blog_realtor_articles 데이터가 없을 수 있습니다.")
            return

        process_article(
            conn,
            article,
            force=args.force,
        )

        print("=" * 80)
        print("[DONE] process_one_article_pipeline")
        print("=" * 80)

    finally:
        conn.close()


if __name__ == "__main__":
    main()