"""Rule-based inquiry classification practice (no LLM, no network).

Run: python classify.py
Reads inquiries.csv (id,text,expected), writes results.csv and prints a summary.
Categories: 배송 / 교환 / 상품 질문 / 분류 불가. Mixed or empty inquiries are flagged for a human.
"""
import csv
import hashlib
import re
from pathlib import Path

RULES = {
    '배송': ['배송', '송장', '택배', '도착', '안 왔'],
    '교환': ['교환', '반품', '환불', '사이즈', '색상', '바꾸'],
    '상품 질문': ['되나요', '있나요', '들어가나요', '사용법', '재질'],
}

root = Path(__file__).resolve().parent
rows = list(csv.DictReader((root / 'inquiries.csv').open(encoding='utf-8')))
seen = {}
out = []
for row in rows:
    text = row['text'].strip()
    key = hashlib.sha1(re.sub(r'\s+', '', text).encode()).hexdigest()[:8]
    hits = {cat: [w for w in words if w in text] for cat, words in RULES.items()}
    hits = {cat: ws for cat, ws in hits.items() if ws}
    review = []
    if len(text) < 3:
        label, review = '분류 불가', ['빈 문의 또는 내용 부족']
    elif not hits:
        label, review = '분류 불가', ['규칙에 걸리는 단어 없음']
    else:
        # 가장 많은 단어가 걸린 유형, 동점이면 RULES 순서
        label = max(hits, key=lambda cat: (len(hits[cat]), -list(RULES).index(cat)))
        if len(hits) > 1:
            review.append('여러 유형: ' + ', '.join(hits))
    if text and key in seen:
        review.append(f'중복: {seen[key]}와 같은 내용')
    seen.setdefault(key, row['id'])
    out.append({'id': row['id'], 'label': label, 'expected': row['expected'],
                'correct': label == row['expected'],
                'evidence': '; '.join(f"{c}({','.join(ws)})" for c, ws in hits.items()),
                'human_check': ' / '.join(review)})

with (root / 'results.csv').open('w', encoding='utf-8-sig', newline='') as f:
    w = csv.DictWriter(f, fieldnames=list(out[0]))
    w.writeheader()
    w.writerows(out)

for r in out:
    mark = 'O' if r['correct'] else 'X'
    print(f"{r['id']} {mark} {r['label']:<6} 근거: {r['evidence'] or '-':<24} 확인: {r['human_check'] or '-'}")
print(f"입력 {len(rows)}건 / 출력 {len(out)}건 / 정답 일치 {sum(r['correct'] for r in out)}건 / 사람 확인 {sum(bool(r['human_check']) for r in out)}건")
