"""
task692_carousel_upload.py
--------------------------
ThreadAuto 카드뉴스 6장을 Threads 캐러셀로 업로드하는 스크립트
토픽: AI 도구가 보험 영업을 어떻게 바꾸는가
담당: 토르 (개발2팀 백엔드)
"""

from __future__ import annotations

import asyncio
import logging
import sys
import traceback

# ThreadAuto 프로젝트 경로 주입
sys.path.insert(0, "/home/jay/projects/ThreadAuto")

# ---------------------------------------------------------------------------
# 로깅 설정
# ---------------------------------------------------------------------------
logging.basicConfig(
    level=logging.INFO,
    format="%(asctime)s [%(levelname)s] %(name)s — %(message)s",
    datefmt="%Y-%m-%d %H:%M:%S",
)
logger = logging.getLogger(__name__)

# ---------------------------------------------------------------------------
# 이미지 경로 (순서 중요: 커버 → 슬라이드 1~4 → CTA)
# ---------------------------------------------------------------------------
IMAGE_PATHS: list[str] = [
    "/home/jay/projects/ThreadAuto/output/cardnews_20260318_164230_00.png",  # 커버
    "/home/jay/projects/ThreadAuto/output/cardnews_20260318_164230_01.png",  # 슬라이드 1
    "/home/jay/projects/ThreadAuto/output/cardnews_20260318_164230_02.png",  # 슬라이드 2
    "/home/jay/projects/ThreadAuto/output/cardnews_20260318_164230_03.png",  # 슬라이드 3
    "/home/jay/projects/ThreadAuto/output/cardnews_20260318_164230_04.png",  # 슬라이드 4
    "/home/jay/projects/ThreadAuto/output/cardnews_20260318_164230_05.png",  # CTA
]

# ---------------------------------------------------------------------------
# 캡션 (면책 문구 포함 — config.py의 AUTO_POST_DISCLAIMER 참조)
# ---------------------------------------------------------------------------
CAPTION = (
    "AI 도구가 보험 영업의 판도를 바꾸고 있습니다."
    " 상담 준비부터 SNS 마케팅, 행정 업무까지 자동화하여 고객 면담에 집중하세요.\n\n"
    "서울대보험크루에서 제작한 AI프로그램이 자동으로 게시하였습니다."
)


# ---------------------------------------------------------------------------
# 메인 비동기 실행 함수
# ---------------------------------------------------------------------------


async def main() -> None:
    # Step 1: 이미지 서버 확인 (HTTP 서버 + Tailscale Funnel)
    logger.info("Step 1: 이미지 서버 상태 확인 (HTTP 서버 + Tailscale Funnel)")
    from publisher.image_server import ImageServer

    server = ImageServer()
    server_ok = server.ensure_server()
    if not server_ok:
        logger.error("이미지 서버 초기화 실패 — 업로드를 중단합니다.")
        sys.exit(1)
    logger.info("이미지 서버 정상 동작 중")

    # Step 2: 공개 URL 생성
    logger.info("Step 2: 공개 URL 생성 (%d개 이미지)", len(IMAGE_PATHS))
    public_urls = server.get_public_urls(IMAGE_PATHS)
    for i, (path, url) in enumerate(zip(IMAGE_PATHS, public_urls)):
        logger.info("  [%d] %s -> %s", i, path, url)

    # Step 3: URL 접근 가능 여부 검증
    logger.info("Step 3: URL 접근 가능 여부 검증")
    verify_results = server.verify_urls(public_urls)
    failed_urls = [url for url, ok in verify_results.items() if not ok]
    if failed_urls:
        logger.error("다음 URL에 접근할 수 없습니다 — 업로드를 중단합니다:")
        for url in failed_urls:
            logger.error("  FAIL: %s", url)
        sys.exit(1)
    logger.info("모든 URL 검증 통과 (%d/%d)", len(public_urls), len(public_urls))

    # Step 4: 액세스 토큰 취득
    logger.info("Step 4: 액세스 토큰 취득")
    from auth.token_store import get_valid_token

    token = get_valid_token()
    if not token:
        logger.error("유효한 액세스 토큰이 없습니다. 먼저 인증을 완료하세요.")
        sys.exit(1)
    logger.info("액세스 토큰 획득 완료 (길이: %d자)", len(token))

    # Step 5: Threads 캐러셀 업로드
    logger.info("Step 5: Threads 캐러셀 업로드 시작")
    logger.info("캡션:\n%s", CAPTION)
    from api.client import ThreadsClient

    client = ThreadsClient(access_token=token)
    post_id = await client.post_carousel(image_urls=public_urls, caption=CAPTION)

    logger.info("=" * 60)
    logger.info("캐러셀 업로드 성공!")
    logger.info("Threads Post ID: %s", post_id)
    logger.info("=" * 60)
    print(f"Post ID: {post_id}")


# ---------------------------------------------------------------------------
# 진입점
# ---------------------------------------------------------------------------

if __name__ == "__main__":
    try:
        asyncio.run(main())
    except Exception:
        logger.error("업로드 중 예외 발생 — 전체 traceback:")
        traceback.print_exc()
        sys.exit(1)
