# -*- coding: utf-8 -*-
"""
STEP111-12 HEE Layout Mode Bridge v1

목적:
- Publish-Always Policy의 layout_mode를 실제 blog_layout_blocks.py의 layout_type 후보로 변환한다.
- 운영 코드에 바로 넣기 전, 어떤 layout_type 후보가 나오는지 안전하게 확인한다.
- 정보 부족은 발행 차단이 아니라 compact/simple 계열 레이아웃으로 연결한다.

사용:
  cd /d D:\honghee\blog_api

  draft 기준:
  python tools\hee_layout_mode_bridge.py --draft-id 209

  article 기준:
  python tools\hee_layout_mode_bridge.py --realtor-id 1 --article-no 2633019770

  JSON:
  python tools\hee_layout_mode_bridge.py --draft-id 209 --json
"""

import argparse
import json
import random
import sys
from pathlib import Path

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

from db import get_conn

# STEP111-11 도구 재사용
from tools.hee_publish_always_policy import (
    fetch_draft,
    fetch_article,
    evaluate_policy,
)


LAYOUT_CANDIDATES = {
    # 주거형 / 정보 풍부
    "living_rich": [
        "storytelling",
        "magazine_style",
        "local_life",
        "family_recommend",
        "premium_report",
        "gallery_story",
    ],
    "living_balanced": [
        "story_first",
        "location_focus",
        "recommendation_focus",
        "storytelling",
        "local_life",
        "photo_grid",
    ],
    "living_simple": [
        "summary_first",
        "minimal_modern",
        "short_review_style",
        "checklist_style",
    ],
    "living_compact": [
        "summary_first",
        "minimal_modern",
        "checklist_style",
    ],
    "living_minimal": [
        "summary_first",
        "minimal_modern",
    ],

    # 일반 건축물
    "building_rich": [
        "storytelling",
        "photo_first",
        "gallery_story",
        "premium_report",
    ],
    "building_balanced": [
        "story_first",
        "summary_first",
        "recommendation_focus",
        "checklist_style",
    ],
    "building_simple": [
        "summary_first",
        "minimal_modern",
        "checklist_style",
    ],
    "building_compact": [
        "summary_first",
        "minimal_modern",
    ],
    "building_minimal": [
        "summary_first",
        "minimal_modern",
    ],

    # 상가/사무실
    "business_rich": [
        "office_focus",
        "location_focus",
        "broker_expert",
        "premium_report",
    ],
    "business_balanced": [
        "office_focus",
        "location_focus",
        "summary_first",
        "checklist_style",
    ],
    "business_simple": [
        "office_focus",
        "summary_first",
        "minimal_modern",
    ],
    "business_compact": [
        "summary_first",
        "minimal_modern",
    ],
    "business_minimal": [
        "summary_first",
        "minimal_modern",
    ],

    # 공장/창고
    "factory_rich": [
        "office_focus",
        "broker_expert",
        "checklist_style",
        "summary_first",
    ],
    "factory_balanced": [
        "office_focus",
        "summary_first",
        "checklist_style",
    ],
    "factory_simple": [
        "summary_first",
        "checklist_style",
        "minimal_modern",
    ],
    "factory_compact": [
        "summary_first",
        "minimal_modern",
    ],
    "factory_minimal": [
        "summary_first",
        "minimal_modern",
    ],

    # 토지
    "land_rich": [
        "land_focus",
    ],
    "land_balanced": [
        "land_focus",
    ],
    "land_simple": [
        "land_focus",
    ],
    "land_compact": [
        "land_focus",
    ],
    "land_minimal": [
        "land_focus",
    ],

    # 알 수 없음
    "generic_rich": [
        "story_first",
        "summary_first",
        "checklist_style",
    ],
    "generic_balanced": [
        "summary_first",
        "checklist_style",
        "minimal_modern",
    ],
    "generic_simple": [
        "summary_first",
        "minimal_modern",
    ],
    "generic_compact": [
        "summary_first",
        "minimal_modern",
    ],
    "generic_minimal": [
        "summary_first",
        "minimal_modern",
    ],
}


def choose_layout_type(layout_mode, article_no=None, realtor_id=None):
    """
    완전 랜덤이 아니라 같은 매물은 비교적 재현 가능하게 선택한다.
    article_no/realtor_id 기반 seed를 사용해 운영 재생성 시 지나친 흔들림을 줄인다.
    """
    candidates = LAYOUT_CANDIDATES.get(layout_mode) or LAYOUT_CANDIDATES.get("generic_simple")

    seed_text = f"{realtor_id or ''}:{article_no or ''}:{layout_mode}"
    rnd = random.Random(seed_text)

    return {
        "layout_mode": layout_mode,
        "selected_layout_type": rnd.choice(candidates),
        "candidates": candidates,
        "selection_rule": "deterministic_random_by_realtor_article_layout_mode",
    }


def build_bridge_result(draft, article):
    policy = evaluate_policy(draft, article)

    bridge = choose_layout_type(
        policy["layout_mode"],
        article_no=policy.get("article_no"),
        realtor_id=policy.get("realtor_id"),
    )

    return {
        "policy": policy,
        "bridge": bridge,
        "can_apply_to_generate_blog_drafts": policy.get("publish_allowed") is True,
        "notes": [
            "정보 부족은 layout_mode를 compact/simple로 낮추는 기준입니다.",
            "매물유형 불일치/법정표시 누락은 발행 전 수정 대상입니다.",
            "운영 코드 적용 전 이 결과로 레이아웃 선택 안정성을 검증합니다.",
        ],
    }


def print_report(result):
    policy = result["policy"]
    bridge = result["bridge"]

    print("=" * 80)
    print("[STEP111-12 HEE LAYOUT MODE BRIDGE]")
    print("draft_id:", policy.get("draft_id"))
    print("realtor_id:", policy.get("realtor_id"))
    print("article_no:", policy.get("article_no"))
    print("title:", policy.get("title"))
    print("-" * 80)
    print("[POLICY]")
    print("property_class:", policy.get("property_class"))
    print("image_count:", policy.get("image_count"))
    print("broker_description_length:", policy.get("broker_description_length"))
    print("layout_mode:", policy.get("layout_mode"))
    print("publish_allowed:", policy.get("publish_allowed"))
    print("-" * 80)
    print("[BRIDGE]")
    print("selected_layout_type:", bridge.get("selected_layout_type"))
    print("candidates:", ", ".join(bridge.get("candidates") or []))
    print("selection_rule:", bridge.get("selection_rule"))
    print("-" * 80)
    print("[CAN APPLY]")
    print(result.get("can_apply_to_generate_blog_drafts"))
    print("=" * 80)


def main():
    parser = argparse.ArgumentParser()
    parser.add_argument("--draft-id", type=int, default=None)
    parser.add_argument("--realtor-id", type=int, default=None)
    parser.add_argument("--article-no", default="")
    parser.add_argument("--json", action="store_true")
    args = parser.parse_args()

    if not args.draft_id and not (args.realtor_id and args.article_no):
        raise RuntimeError("--draft-id 또는 --realtor-id + --article-no 필요")

    conn = get_conn()

    try:
        draft = fetch_draft(
            conn,
            draft_id=args.draft_id,
            realtor_id=args.realtor_id,
            article_no=args.article_no,
        )
        if not draft:
            raise RuntimeError("draft not found")

        article = fetch_article(conn, draft.get("realtor_id"), draft.get("article_no")) or {}
        result = build_bridge_result(draft, article)

        if args.json:
            print(json.dumps(result, ensure_ascii=False, indent=2, default=str))
        else:
            print_report(result)

    finally:
        conn.close()


if __name__ == "__main__":
    main()
