# -*- coding: utf-8 -*-
"""수익률 계산 엔진 (규칙 기반, 3시나리오)"""
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


def calc(cfg, item, score, risk):
    r = cfg["roi"]
    pred = score["predicted_bid_price"] or item["min_bid_price"] or 0
    mkt = score["market_price_est"] or int((item["appraisal_price"] or 0) * 0.95)

    tax_rate = r["acquisition_tax"].get(item["property_type"], 0.046)
    evict_diff = "MID"
    extra_cost = 0
    if risk:
        rj = risk if isinstance(risk, dict) else json.loads(risk)
        evict_diff = rj.get("estimated_eviction_difficulty", "MID")
        extra_cost = int(rj.get("estimated_extra_cost") or 0)
        st = rj.get("senior_tenant") or {}
        if st.get("exists") and st.get("opposing_power") and not st.get("priority_repayment"):
            extra_cost += int(st.get("deposit_amount") or 0)

    acq_tax = int(pred * tax_rate)
    reg_cost = int(pred * r["registration_cost_rate"])
    evict = r["eviction_cost"].get(evict_diff, r["eviction_cost"]["MID"])
    repair = int(float(item["area_building"] or 60) * r["repair_cost_per_m2"])
    loan = int(pred * r["loan_ltv"])
    interest = int(loan * r["loan_rate_annual"] * r["holding_months"] / 12)
    equity = pred - loan

    total_cost = pred + acq_tax + reg_cost + evict + repair + extra_cost + interest
    results = {}
    for scenario, ratio in r["exit_ratio"].items():
        exit_price = int(mkt * ratio)
        profit = exit_price - total_cost
        cash_in = equity + acq_tax + reg_cost + evict + repair + extra_cost + interest
        roi_pct = round(profit / cash_in * 100, 2) if cash_in > 0 else 0.0
        results[scenario] = {
            "est_total_cost": total_cost, "est_exit_price": exit_price,
            "est_profit": profit, "roi_pct": roi_pct,
            "detail": {
                "예상낙찰가": pred, "취득세": acq_tax, "등기비용": reg_cost,
                "명도비용": evict, "수리비": repair, "인수추가비용": extra_cost,
                "대출이자": interest, "대출금": loan, "자기자본": cash_in,
                "추정시세": mkt,
            },
        }
    return results


def run():
    cfg = get_config()
    started = datetime.now()
    today = date.today()
    processed = 0
    conn = get_conn()
    try:
        with conn.cursor() as cur:
            cur.execute(
                """SELECT i.*, s.predicted_bid_price, s.market_price_est, s.item_id,
                          r.risk_json
                   FROM item_scores s
                   JOIN auction_items i ON i.id = s.item_id
                   LEFT JOIN risk_analysis r ON r.item_id = s.item_id
                   WHERE s.score_date=%s AND s.rank_today <= %s""",
                (today, cfg["scoring"]["candidate_n"]))
            rows = cur.fetchall()
            for row in rows:
                score = {"predicted_bid_price": row["predicted_bid_price"],
                         "market_price_est": row["market_price_est"]}
                risk = json.loads(row["risk_json"]) if row["risk_json"] else None
                scen = calc(cfg, row, score, risk)
                for name, v in scen.items():
                    cur.execute(
                        """INSERT INTO roi_analysis
                           (item_id, calc_date, scenario, est_total_cost,
                            est_exit_price, est_profit, roi_pct, detail_json)
                           VALUES (%s,%s,%s,%s,%s,%s,%s,%s)
                           ON DUPLICATE KEY UPDATE
                             est_total_cost=VALUES(est_total_cost),
                             est_exit_price=VALUES(est_exit_price),
                             est_profit=VALUES(est_profit),
                             roi_pct=VALUES(roi_pct),
                             detail_json=VALUES(detail_json)""",
                        (row["item_id"], today, name, v["est_total_cost"],
                         v["est_exit_price"], v["est_profit"], v["roi_pct"],
                         json.dumps(v["detail"], ensure_ascii=False)))
                processed += 1
        log_stage("roi", "success", processed, started_at=started)
        print(f"[roi] {processed}건 수익률 계산 완료")
    except Exception as e:
        log_stage("roi", "failed", processed, str(e), started)
        raise
    finally:
        conn.close()


if __name__ == "__main__":
    run()
