# -*- coding: utf-8 -*-
"""
봉수 인간개입지수(BHII) v0 — 계산 규칙 (4장 4.6절 설계의 코드판)
저자: 조봉수(봉수 SSGlobal(주) 대표이사, 필명) · 작성 협업: Claude(인공지능)

원칙 : 증거가 남은 사람 몫만 센다. 증거가 없으면 0점.
입력 : 문장 단위 출처원장(CSV) — AI개입지수(BAII) 원장에 칸 2개 추가
        작성주체 : 대표구술 / 대표집필 / AI초안_대표수정 / 대표검수만 / AI단독 / 외부인용
        증거     : 녹음파일·원본파일·수정이력·검수기록 경로 (없으면 빈칸)
        글자수   : 그 문장의 글자 수
계산 : BHII = 100 × Σ(가중치 × 글자수 × 증거있음) ÷ Σ(글자수, 외부인용 제외)
가중치(제안값, 봉인 전 대표 승인 필요):
        대표구술 1.0 · 대표집필 1.0 · AI초안_대표수정 0.5 · 대표검수만 0.2 · AI단독 0
        외부인용은 분자·분모 모두에서 뺀다(남의 글은 사람 몫도 AI 몫도 아님).
등급 : H1 60 이상 / H2 40~60 / H3 20~40 / H4 5~20 / H5 5 미만
실행 : python -X utf8 bhii_v0.py 원장.csv     (인자 없으면 가상 시험입력으로 동작 확인)
"""
import sys

import pandas as pd

WEIGHT = {"대표구술": 1.0, "대표집필": 1.0, "AI초안_대표수정": 0.5, "대표검수만": 0.2, "AI단독": 0.0}
GRADES = [(60, "H1"), (40, "H2"), (20, "H3"), (5, "H4"), (0, "H5")]


def bhii(ledger: pd.DataFrame) -> dict:
    df = ledger.copy()
    bad = set(df["작성주체"]) - set(WEIGHT) - {"외부인용"}
    if bad:
        raise ValueError(f"알 수 없는 작성주체: {bad}")
    df = df[df["작성주체"].ne("외부인용")]
    has_ev = df["증거"].fillna("").astype(str).str.strip().ne("")
    w = df["작성주체"].map(WEIGHT) * has_ev
    num = (w * df["글자수"]).sum()
    den = df["글자수"].sum()
    score = float(round(100 * num / den, 1)) if den else 0.0
    grade = next(g for cut, g in GRADES if score >= cut)
    no_ev = df[df["작성주체"].ne("AI단독") & ~has_ev]
    return {"BHII": score, "등급": grade, "대상글자수": int(den),
            "증거없어_0점처리된_사람몫_글자수": int(no_ev["글자수"].sum())}


def _test():
    # 가상 시험입력 — 실제 자료 아님. 규칙이 의도대로 도는지만 확인한다.
    t = pd.DataFrame([
        ("대표구술", "녹음/20261015_공제조합심사.m4a", 400),
        ("AI초안_대표수정", "수정이력/v2.docx", 600),
        ("대표검수만", "", 300),            # 증거 없음 → 0점
        ("AI단독", "", 1200),
        ("외부인용", "KCI 논문", 500),       # 분모에서 제외
    ], columns=["작성주체", "증거", "글자수"])
    r = bhii(t)
    # 기대값: (400×1.0 + 600×0.5) / (400+600+300+1200) = 700/2500 = 28.0 → H3
    assert r["BHII"] == 28.0 and r["등급"] == "H3", r
    assert r["증거없어_0점처리된_사람몫_글자수"] == 300, r
    return r


if __name__ == "__main__":
    if len(sys.argv) > 1:
        print(bhii(pd.read_csv(sys.argv[1])))
    else:
        print("가상 시험입력 결과(실제 자료 아님):", _test())
