# -*- coding: utf-8 -*-
'''
긴급 패치: services/ollama_writer.py 매물유형 오판/환각 방지

사용:
  cd /d D:\honghee\blog_api
  python tools\patch_ollama_writer_property_guard.py
'''

from pathlib import Path
from datetime import datetime

ROOT = Path(__file__).resolve().parents[1]
TARGET = ROOT / 'services' / 'ollama_writer.py'

if not TARGET.exists():
    raise FileNotFoundError(TARGET)

text = TARGET.read_text(encoding='utf-8', errors='replace')

backup = TARGET.with_name(f"ollama_writer_backup_property_guard_{datetime.now().strftime('%Y%m%d_%H%M%S')}.py")
backup.write_text(text, encoding='utf-8')
print('[BACKUP]', backup)

old_block = """매물 정보:

[기본정보]
- 매물명: {article_name}
- 설명: {article_desc}
- 거래유형: {trade_type}
- 부동산유형: {real_estate_type}
"""

new_block = """매물 정보:

[매물유형 확정 규칙 - 매우 중요]
- 부동산유형은 \"{real_estate_type}\"로 확정한다.
- 부동산유형을 절대 다른 유형으로 바꾸거나 추론하지 마라.
- 부동산유형이 아파트/오피스텔/빌라/주택/상가/사무실이면 토지 매물처럼 작성하지 마라.
- 아파트/오피스텔/빌라/주택/상가/사무실 문서에서는 다음 표현을 절대 쓰지 마라:
  토지 개요, 토지 핵심 정보, 토지 확인 포인트, 토지 매물, 토지면적, 지목, 접도, 진입로, 개발 가능성, 건축허가, 토지이용계획, 임야, 대지
- 주소에 산/전/답/대전 같은 글자가 들어가도 매물유형을 토지로 판단하지 마라.
- 제공된 매물정보에 없는 장점, 투자성, 개발 가능성, 학군, 교통 정보는 만들지 마라.
- 정보가 부족하면 짧고 정확하게 작성하라.

[기본정보]
- 매물명: {article_name}
- 설명: {article_desc}
- 거래유형: {trade_type}
- 부동산유형: {real_estate_type}
"""

if old_block in text and '매물유형 확정 규칙 - 매우 중요' not in text:
    text = text.replace(old_block, new_block, 1)
    print('[PATCH] prompt property guard added')
else:
    print('[SKIP] prompt guard already exists or target block not found')

guard_func = """

def contains_forbidden_property_mismatch(article_detail, sections):
    real_estate_type = str(article_detail.get('real_estate_type') or '').strip()
    joined = ' '.join(str(v or '') for v in (sections or {}).values())

    building_types = ['아파트', '오피스텔', '빌라', '연립', '다세대', '주택', '상가', '사무실']
    land_forbidden_words = [
        '토지 개요',
        '토지 핵심',
        '토지 확인',
        '토지 매물',
        '토지면적',
        '지목',
        '접도',
        '진입로',
        '개발 가능성',
        '건축허가',
        '토지이용계획',
        '임야',
        '대지',
    ]

    if any(t in real_estate_type for t in building_types):
        if any(word in joined for word in land_forbidden_words):
            return True

    return False
"""

if 'def contains_forbidden_property_mismatch' not in text:
    insert_at = text.find('\ndef generate_ai_sections')
    if insert_at < 0:
        raise RuntimeError('cannot find generate_ai_sections')
    text = text[:insert_at] + guard_func + text[insert_at:]
    print('[PATCH] forbidden property mismatch validator added')
else:
    print('[SKIP] validator already exists')

old_return = """        return {
            \"intro\": parsed.get(\"intro\", \"\"),
            \"location\": parsed.get(\"location\", \"\"),
            \"space\": parsed.get(\"space\", \"\"),
            \"point\": parsed.get(\"point\", \"\"),
            \"price\": parsed.get(\"price\", \"\"),
            \"school\": parsed.get(\"school\", \"\"),
            \"investment\": parsed.get(\"investment\", \"\"),
            \"caution\": parsed.get(\"caution\", \"\"),
            \"realtor\": parsed.get(\"realtor\", \"\"),
            \"closing\": parsed.get(\"closing\", \"\"),
        }
"""

new_return = """        sections = {
            \"intro\": parsed.get(\"intro\", \"\"),
            \"location\": parsed.get(\"location\", \"\"),
            \"space\": parsed.get(\"space\", \"\"),
            \"point\": parsed.get(\"point\", \"\"),
            \"price\": parsed.get(\"price\", \"\"),
            \"school\": parsed.get(\"school\", \"\"),
            \"investment\": parsed.get(\"investment\", \"\"),
            \"caution\": parsed.get(\"caution\", \"\"),
            \"realtor\": parsed.get(\"realtor\", \"\"),
            \"closing\": parsed.get(\"closing\", \"\"),
        }

        if contains_forbidden_property_mismatch(article_detail, sections):
            print(\"[OLLAMA PROPERTY MISMATCH BLOCKED]\", article_detail.get(\"article_title\"), article_detail.get(\"real_estate_type\"))
            return fallback_sections(article_detail)

        return sections
"""

if old_return in text and 'OLLAMA PROPERTY MISMATCH BLOCKED' not in text:
    text = text.replace(old_return, new_return, 1)
    print('[PATCH] AI sections validation added')
else:
    print('[SKIP] AI sections validation already exists or target block not found')

TARGET.write_text(text, encoding='utf-8')
print('[DONE]', TARGET)