# -*- coding: utf-8 -*-
"""推論スクリプト（バッチ／単件）。

バッチ:
    python predict.py --input <training_dataset互換CSV> --output <結果CSV>
単件デモ:
    python predict.py --demo
単件(JSON):
    python predict.py --record record.json
"""
from __future__ import annotations
import argparse
import json
from pathlib import Path

import pandas as pd
import soup_scoring as S

HERE = Path(__file__).resolve().parent
ROOT = HERE.parents[1]
MODEL_DIR = HERE / "models"
DEFAULT_INPUT = ROOT / "local_batch_api" / "output_full" / "training_dataset.csv"

DEMO_SCOREABLE = {
    "video_path": "demo_ok.MOV", "brix_raw": 12.0, "slot": "開店前", "store": "demo",
    "visual_density": "12", "water_level": "水位良好",
    "oil_emulsification": "乳化が進んでいる", "boiling_heat_state": "良い",
    "photo_quality": "良い", "image_condition_score": 8,
}
DEMO_UNASSESSABLE = {
    "video_path": "demo_ng.MOV", "brix_raw": None, "slot": "昼", "store": "demo",
    "visual_density": "判定不可", "water_level": "判定不可",
    "oil_emulsification": "判定不可", "boiling_heat_state": "判定不可",
    "photo_quality": "湯気が多い", "image_condition_score": 2,
}


def main() -> None:
    ap = argparse.ArgumentParser()
    ap.add_argument("--input", default=None, help="バッチ入力CSV")
    ap.add_argument("--output", default=None, help="バッチ結果CSV")
    ap.add_argument("--record", default=None, help="単件JSONファイル")
    ap.add_argument("--demo", action="store_true", help="単件デモ実行")
    ap.add_argument("--model-dir", default=str(MODEL_DIR))
    args = ap.parse_args()

    models = S.load_models(args.model_dir)

    if args.demo:
        for rec in (DEMO_SCOREABLE, DEMO_UNASSESSABLE):
            print(json.dumps(S.score_record(rec, models), ensure_ascii=False, indent=2))
        return

    if args.record:
        rec = json.loads(Path(args.record).read_text(encoding="utf-8"))
        print(json.dumps(S.score_record(rec, models), ensure_ascii=False, indent=2))
        return

    # バッチ
    input_csv = args.input or str(DEFAULT_INPUT)
    output_csv = args.output or str(HERE / "predictions_out.csv")
    raw = pd.read_csv(input_csv)
    res = S.score_batch(raw, models)
    res.to_csv(output_csv, index=False, encoding="utf-8-sig")
    n = len(res)
    scored = (res["status"] == "scored").sum()
    print(f"バッチ推論完了: {n}件中 scored={scored} / 要確認={n - scored}")
    print("出力:", output_csv)


if __name__ == "__main__":
    main()
