# -*- coding: utf-8 -*-
"""ChatGPT(OpenAI) API 기반 권리분석
- 매각물건명세서/현황조사서 원문 → 구조화 리스크 JSON
- 보수적 판정 원칙: 불확실하면 HIGH
"""
import sys, os, json
from datetime import datetime, date

sys.path.insert(0, os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
from db.models import get_config, get_conn, log_stage

SYSTEM_PROMPT = """당신은 한국 법원 부동산경매 권리분석 전문가다.
매각물건명세서와 현황조사서 원문을 분석하여 리스크를 JSON으로만 출력한다.

판정 기준:
- 대항력: 말소기준권리 설정일보다 앞선 전입신고 + 점유 시 인정
- 선순위 임차인의 보증금은 배당요구 여부/우선변제권에 따라 인수 가능성 판단
- 유치권 신고, 법정지상권 성립 여지, 지분매각, 대지권 미등기는 즉시 리스크 상향
- **판단 근거가 불충분하거나 문서가 불명확하면 반드시 risk_level을 "HIGH"로 분류한다** (보수 원칙)

출력은 아래 JSON 스키마만, 다른 텍스트/마크다운 없이:
{
  "senior_tenant": {"exists": bool, "deposit_amount": int|null,
                    "opposing_power": bool, "priority_repayment": bool},
  "lien": bool,
  "legal_superficies": bool,
  "share_sale": bool,
  "land_right_issue": bool,
  "occupancy": "점유현황 1문장",
  "estimated_eviction_difficulty": "LOW"|"MID"|"HIGH",
  "estimated_extra_cost": int,
  "risk_level": "LOW"|"MID"|"HIGH",
  "risk_summary": "3문장 이내 한국어 요약"
}"""


def analyze_item(client, cfg, docs_text):
    resp = client.chat.completions.create(
        model=cfg["llm"]["model"],
        max_tokens=cfg["llm"]["max_tokens"],
        response_format={"type": "json_object"},   # JSON 강제
        messages=[
            {"role": "system", "content": SYSTEM_PROMPT},
            {"role": "user",
             "content": f"다음 경매물건 문서를 분석하라:\n\n{docs_text[:12000]}"},
        ],
    )
    text = (resp.choices[0].message.content or "").strip()
    text = text.replace("```json", "").replace("```", "").strip()
    return json.loads(text)


def fallback_risk():
    return {
        "senior_tenant": {"exists": False, "deposit_amount": None,
                          "opposing_power": False, "priority_repayment": False},
        "lien": False, "legal_superficies": False, "share_sale": False,
        "land_right_issue": False, "occupancy": "분석 실패 - 문서 미확보",
        "estimated_eviction_difficulty": "HIGH", "estimated_extra_cost": 0,
        "risk_level": "HIGH",
        "risk_summary": "권리분석에 실패하여 보수 원칙에 따라 HIGH로 분류함. 문서 직접 확인 필요.",
    }


def run():
    cfg = get_config()
    started = datetime.now()
    processed = 0
    today = date.today()

    try:
        from openai import OpenAI
        client = OpenAI(api_key=cfg["llm"]["api_key"])
    except Exception as e:
        log_stage("risk", "failed", 0, f"LLM client init: {e}", started)
        print("[risk] LLM 초기화 실패 - 전체 스킵 (보고서는 축약 발송됨)")
        return

    conn = get_conn()
    try:
        with conn.cursor() as cur:
            # 당일 스코어 상위 candidate_n건 중 미분석 건만
            cur.execute(
                """SELECT s.item_id FROM item_scores s
                   LEFT JOIN risk_analysis r ON r.item_id = s.item_id
                   WHERE s.score_date=%s AND s.rank_today <= %s AND r.id IS NULL
                   ORDER BY s.rank_today""",
                (today, cfg["scoring"]["candidate_n"]))
            targets = [r["item_id"] for r in cur.fetchall()]

            for iid in targets:
                cur.execute(
                    "SELECT doc_type, raw_text FROM item_documents WHERE item_id=%s",
                    (iid,))
                docs = cur.fetchall()
                docs_text = "\n\n".join(
                    f"=== {d['doc_type']} ===\n{d['raw_text']}" for d in docs)
                if len(docs_text) < 200:
                    risk = fallback_risk()
                else:
                    try:
                        risk = analyze_item(client, cfg, docs_text)
                    except Exception as e:
                        print(f"[risk] item {iid} 분석 실패: {e}")
                        risk = fallback_risk()

                cur.execute(
                    """INSERT INTO risk_analysis
                       (item_id, analyzed_at, risk_level, risk_json, summary_text, llm_model)
                       VALUES (%s,NOW(),%s,%s,%s,%s)""",
                    (iid, risk.get("risk_level", "HIGH"),
                     json.dumps(risk, ensure_ascii=False),
                     risk.get("risk_summary", ""), cfg["llm"]["model"]))
                processed += 1

        # 리스크 반영 재순위
        from analysis.scorer import rerank_after_risk
        rerank_after_risk()

        log_stage("risk", "success", processed, started_at=started)
        print(f"[risk] {processed}건 권리분석 완료 + 재순위")
    except Exception as e:
        log_stage("risk", "failed", processed, str(e), started)
        raise
    finally:
        conn.close()


if __name__ == "__main__":
    run()
