"""보험저널 뉴스 기반 텍스트 콘텐츠 생성 및 Threads 업로드 스크립트 (task-1047.1)"""

import json
import logging
import sys

logging.basicConfig(level=logging.INFO, format="%(asctime)s [%(levelname)s] %(message)s")
logger = logging.getLogger(__name__)

sys.path.insert(0, "/home/jay/projects/ThreadAuto")

from content.fact_guard import validate_numbers
from content.text_generator import TextContentGenerator
from content.text_utils import ensure_line_breaks
from publisher.threads_publisher import ThreadsPublisher

NEWS_CACHE_PATH = "/home/jay/projects/ThreadAuto/content/news_cache.json"


def load_best_insjournal_article():
    """news_cache.json에서 보험저널 기사 중 relevance_score 최고 기사 선택"""
    with open(NEWS_CACHE_PATH, encoding="utf-8") as f:
        articles = json.load(f)

    insjournal_articles = [a for a in articles if a.get("source") == "보험저널"]
    if not insjournal_articles:
        raise ValueError("보험저널 기사가 없습니다.")

    insjournal_articles.sort(key=lambda a: a.get("relevance_score", 0), reverse=True)
    best = insjournal_articles[0]
    logger.info("선택된 기사: %s (score=%s)", best.get("title"), best.get("relevance_score"))
    logger.info("기사 URL: %s", best.get("url"))
    return best, insjournal_articles.index(best)


def build_topic(article, article_idx):
    """기사를 topic_selector 호환 topic dict로 변환"""
    topic = {
        "id": f"news-insjournal-{article_idx}",
        "category": "업계동향",
        "title": article["title"],
        "description": article["summary"],
        "card_type": "T",
        "keywords": article.get("matched_keywords", {}).get("primary", []),
        "used_count": 0,
        "last_used": None,
    }
    logger.info("topic dict 생성 완료: id=%s, category=%s", topic["id"], topic["category"])
    return topic


def generate_text_with_retry(generator, topic, text_type, max_retries=2):
    """텍스트 생성 후 fact_guard 검증, 실패 시 최대 max_retries회 재시도"""
    result = generator.generate(topic=topic, text_type=text_type)
    text = ensure_line_breaks(result["text"])
    hashtags = result.get("hashtags", [])

    for attempt in range(max_retries + 1):
        guard_result = validate_numbers(text)
        if guard_result["passed"]:
            logger.info("수치 검증 통과 (attempt %d)", attempt + 1)
            return text, hashtags
        else:
            logger.warning(
                "수치 검증 실패 (시도 %d/%d): %s",
                attempt + 1,
                max_retries + 1,
                guard_result["violations"],
            )
            if attempt < max_retries:
                logger.info("재생성 시도...")
                result = generator.generate(topic=topic, text_type=text_type)
                text = ensure_line_breaks(result["text"])
                hashtags = result.get("hashtags", [])
            else:
                error_msg = f"FactGuard 검증 실패: {guard_result['violations']}"
                logger.error("수치 검증 최종 실패. 업로드 중단.")
                return None, error_msg

    return text, hashtags


def main():
    # 1. 뉴스 선택
    article, article_idx = load_best_insjournal_article()

    # 2. topic dict 생성
    topic = build_topic(article, article_idx)

    # 3. 텍스트 생성
    logger.info("텍스트 생성 시작 (text_type=text_insight)")
    generator = TextContentGenerator()
    text_result, hashtags_or_error = generate_text_with_retry(generator, topic, text_type="text_insight", max_retries=2)

    # 수치 검증 최종 실패 처리
    if text_result is None:
        summary = {
            "success": False,
            "post_id": None,
            "text": None,
            "full_text_with_hashtags": None,
            "hashtags": [],
            "char_count": 0,
            "article_title": article["title"],
            "article_url": article["url"],
            "error": hashtags_or_error,
        }
        print("\n" + "=" * 60)
        print("RESULT_JSON_START")
        print(json.dumps(summary, ensure_ascii=False, indent=2))
        print("RESULT_JSON_END")
        print("=" * 60)
        return summary

    text = text_result
    hashtags = hashtags_or_error

    logger.info("생성된 텍스트:\n%s", text)
    logger.info("해시태그: %s", hashtags)
    logger.info("글자수: %d", len(text))

    # 5. Threads 업로드
    publisher = ThreadsPublisher()

    full_text = text
    if hashtags:
        full_text = text + "\n\n" + " ".join(hashtags)

    post_data = {
        "content": {"text": full_text, "caption": full_text},
        "image_path": "",  # 텍스트 전용
        "post_id": None,
    }

    logger.info("Threads 업로드 시작...")
    publish_result = publisher.publish(post_data)

    if publish_result["success"]:
        logger.info("Threads 업로드 성공! post_id: %s", publish_result.get("threads_post_id"))
    else:
        logger.error("Threads 업로드 실패: %s", publish_result.get("error"))

    # 6. 결과 출력
    summary = {
        "success": publish_result["success"],
        "post_id": publish_result.get("threads_post_id"),
        "text": text,
        "full_text_with_hashtags": full_text,
        "hashtags": hashtags,
        "char_count": len(text),
        "article_title": article["title"],
        "article_url": article["url"],
        "error": publish_result.get("error"),
    }

    print("\n" + "=" * 60)
    print("RESULT_JSON_START")
    print(json.dumps(summary, ensure_ascii=False, indent=2))
    print("RESULT_JSON_END")
    print("=" * 60)

    return summary


if __name__ == "__main__":
    main()
