# -*- coding: utf-8 -*-
"""
visual_density 11/12 境界判定の人手確認用CSVを生成する。
features から visual_density_num が 11/12 の行を抽出し、
human_total_score の予測誤差を結合して出力する。
"""
import os
import pandas as pd

BASE = r"C:\Users\NX023286.NEXYZ\Documents\開発しているもの\制作中\AIラーメン評価アルゴリズム分析"
FEATURES = os.path.join(BASE, "検証", "results", "downstream_model_comparison", "features.csv")
PREDICTIONS = os.path.join(BASE, "検証", "results", "downstream_model_comparison", "predictions.csv")
OUT_DIR = os.path.join(BASE, "精度改善_20260619", "02_density_boundary")
OUT_CSV = os.path.join(OUT_DIR, "density_boundary_11_12.csv")

PREF_FEATURE_SET = "visual_plus_brix"
PREF_MODEL = "線形回帰"


def pick_total_errors(pred):
    """human_total_score の予測誤差を sample_id 単位で返す。"""
    tt = pred[pred["target"] == "human_total_score"].copy()
    # 優先: visual_plus_brix + 線形回帰
    sub = tt[(tt["feature_set"] == PREF_FEATURE_SET) & (tt["model"] == PREF_MODEL)]
    if sub.empty:
        # 代表モデルにフォールバック
        if (tt["feature_set"] == PREF_FEATURE_SET).any():
            tt = tt[tt["feature_set"] == PREF_FEATURE_SET]
        chosen_model = tt["model"].value_counts().idxmax()
        sub = tt[tt["model"] == chosen_model]
        print(f"[info] フォールバック使用: feature_set={sub['feature_set'].iloc[0]}, model={chosen_model}")
    else:
        print(f"[info] 使用モデル: feature_set={PREF_FEATURE_SET}, model={PREF_MODEL}")
    # split問わず sample_id 単位（重複時は先勝ち）
    sub = sub.drop_duplicates(subset="sample_id", keep="first")
    return sub[["sample_id", "prediction", "error"]].rename(
        columns={"prediction": "total_pred", "error": "total_error"}
    )


def main():
    os.makedirs(OUT_DIR, exist_ok=True)
    feat = pd.read_csv(FEATURES, encoding="utf-8-sig")
    pred = pd.read_csv(PREDICTIONS, encoding="utf-8-sig")

    boundary = feat[feat["visual_density_num"].isin([11, 12])].copy()
    if "summary" not in boundary.columns:
        print("[warn] features.csv に summary 列が無いため空列で出力します")
        boundary["summary"] = ""
    errs = pick_total_errors(pred)
    merged = boundary.merge(errs, on="sample_id", how="left")

    cols = [
        "sample_id", "video_path", "frame_path", "store", "slot",
        "visual_density_num", "brix", "density_brix_abs_diff", "density_brix_signed_diff",
        "human_soup_score", "human_total_score", "total_pred", "total_error",
        "water_level", "oil_emulsification", "boiling_heat_state", "photo_quality", "summary",
    ]
    out = merged[cols].copy()
    out["境界判定妥当(yes/no)"] = ""
    out["正しいと思うdensity"] = ""
    out["メモ"] = ""

    out = out.sort_values(
        by=["visual_density_num", "density_brix_abs_diff"],
        ascending=[False, False],
    ).reset_index(drop=True)

    out.to_csv(OUT_CSV, index=False, encoding="utf-8-sig")

    n12 = (out["visual_density_num"] == 12).sum()
    n11 = (out["visual_density_num"] == 11).sum()
    print(f"[out] {OUT_CSV}")
    print(f"[stat] visual_density_num=12: {n12}件 / =11: {n11}件 / 合計: {len(out)}件")
    print("[stat] brix矛盾(density_brix_abs_diff)が大きい上位5件:")
    top5 = out.sort_values("density_brix_abs_diff", ascending=False).head(5)
    for _, r in top5.iterrows():
        print(f"  sample_id={r['sample_id']} dens={int(r['visual_density_num'])} "
              f"brix={r['brix']} abs_diff={r['density_brix_abs_diff']}")


if __name__ == "__main__":
    main()
