# -*- coding: utf-8 -*-
"""
STEP103-13 Run V2 Scheduler with DB Lock

역할:
- V2SchedulerEngine 실행 진입점.
- 08:00~23:00 연속 파이프라인 운영.
- Cursor 기반으로 다음 실행 시 이어서 처리.
- DB Lock으로 V2 Scheduler 중복 실행을 방지한다.
- 기본은 dry-run 발행.
- --execute-publish 옵션이 있을 때만 실제 네이버 블로그 발행 수행.

실행 예:
  cd /d D:/honghee/blog_api

  # 행복공인 1명 dry-run
  python -m tools.run_v2_scheduler --realtor-id 1 --max-realtors 1

  # 행복공인 실제 발행
  python -m tools.run_v2_scheduler --realtor-id 1 --max-realtors 1 --execute-publish --yes

  # 서버 운영 dry-run
  python -m tools.run_v2_scheduler --max-realtors 10

  # 서버 실제 운영
  python -m tools.run_v2_scheduler --execute-publish --yes
"""

import argparse
import sys
from pathlib import Path

ROOT = Path(__file__).resolve().parents[1]
sys.path.insert(0, str(ROOT))

from db import get_conn
from services.v2.v2_scheduler_engine import V2SchedulerEngine
from services.v2.scheduler_lock import SchedulerLock


def main():
    parser = argparse.ArgumentParser()

    parser.add_argument("--scheduler-key", default="server_default")
    parser.add_argument("--scheduler-type", default="server")

    parser.add_argument("--window-start", default="08:00")
    parser.add_argument("--window-end", default="23:00")

    parser.add_argument("--realtor-id", type=int, default=None)
    parser.add_argument("--max-realtors", type=int, default=None)

    parser.add_argument("--lock-ttl-minutes", type=int, default=720)
    parser.add_argument(
        "--no-lock",
        action="store_true",
        help="DB Scheduler Lock 사용 안 함. 테스트 외에는 권장하지 않음.",
    )

    parser.add_argument(
        "--execute-publish",
        action="store_true",
        help="실제 네이버 블로그 발행 실행. 없으면 dry-run.",
    )

    parser.add_argument(
        "--yes",
        action="store_true",
        help="실제 발행 확인 프롬프트 없이 실행.",
    )

    args = parser.parse_args()

    if args.execute_publish and not args.yes:
        print("=" * 80)
        print("[V2 SCHEDULER REAL PUBLISH WARNING]")
        print("이 명령은 실제 네이버 블로그 발행을 수행할 수 있습니다.")
        print("scheduler_key:", args.scheduler_key)
        print("realtor_id:", args.realtor_id)
        print("max_realtors:", args.max_realtors)
        print("window:", args.window_start, "~", args.window_end)
        print("=" * 80)
        confirm = input("계속 진행하려면 YES 를 입력하세요: ").strip()
        if confirm != "YES":
            print("취소되었습니다.")
            return

    conn = get_conn()
    lock = None
    lock_acquired = False

    try:
        if not args.no_lock:
            lock = SchedulerLock(
                conn,
                scheduler_key=args.scheduler_key,
                ttl_minutes=args.lock_ttl_minutes,
            )

            lock_acquired = lock.acquire()

            if not lock_acquired:
                current = lock.current()
                print("=" * 80)
                print("[V2 SCHEDULER LOCKED]")
                print("이미 실행 중인 V2 Scheduler가 있습니다.")
                print("scheduler_key:", args.scheduler_key)
                print("lock:", current)
                print("=" * 80)
                return

            print("[V2 SCHEDULER LOCK ACQUIRED]", lock.lock_name)

        engine = V2SchedulerEngine(
            conn=conn,
            scheduler_key=args.scheduler_key,
            scheduler_type=args.scheduler_type,
            window_start=args.window_start,
            window_end=args.window_end,
            execute_publish=args.execute_publish,
        )

        result = engine.run(
            max_realtors=args.max_realtors,
            realtor_id=args.realtor_id,
        )

        print("=" * 80)
        print("[V2 SCHEDULER DONE]")
        print("scheduler_key:", args.scheduler_key)
        print("execute_publish:", args.execute_publish)
        print("result:", result)
        print("=" * 80)

    finally:
        try:
            if lock and lock_acquired:
                released = lock.release()
                print("[V2 SCHEDULER LOCK RELEASED]", released)
        finally:
            conn.close()


if __name__ == "__main__":
    main()
