#!/usr/bin/env python3
import hashlib
import json
import re
import sys
from pathlib import Path

PROJECT = Path(__file__).resolve().parents[1]
WORD_RE = re.compile(r"[^\W_]+(?:['’-][^\W_]+)*", re.UNICODE)

def sha(path):
    h=hashlib.sha256()
    with path.open('rb') as f:
        for b in iter(lambda:f.read(8*1024*1024),b''): h.update(b)
    return h.hexdigest()

def ngrams(text,n=10):
    tokens=WORD_RE.findall(text.casefold())
    return set(tuple(tokens[i:i+n]) for i in range(max(0,len(tokens)-n+1)))

def main():
    brief=json.loads((PROJECT/'script/story-brief.json').read_text(encoding='utf-8'))
    text=(PROJECT/'story/spoken-narration.txt').read_text(encoding='utf-8')
    family=brief['primary_story_family']
    old_texts=[]
    for p in sorted((PROJECT.parent).glob('0[0-1][0-5]-*/story/spoken-narration.txt')):
        if p.parts[-3] == PROJECT.name: continue
        try: old_texts.append((p.parent.parent.name,p.read_text(encoding='utf-8'))) 
        except OSError: pass
    current=ngrams(text); ratios=[]
    for name,old in old_texts:
        other=ngrams(old); ratios.append({'project':name,'ratio':len(current & other)/len(current) if current else 0.0})
    forbidden=['cao trào nghề nghiệp','tranh chấp cộng đồng','điều tra hình sự','tình địch']
    lower=text.casefold()
    issues=[]
    if family != 'Cưới trước yêu sau / hôn ước từ bé': issues.append('family_mismatch')
    required = ['ly hôn', 'hôn ước', 'nghĩa vụ', 'tự do', 'muốn gặp tôi']
    if not all(x in lower for x in required): issues.append('required_payoff_markers_missing')
    if not all(x in lower for x in ['sau khi đã có quyền rời khỏi nhau', 'không còn nghĩa vụ']): issues.append('payoff_causal_evidence_missing')
    if any(x in lower for x in forbidden): issues.append('forbidden_engine_marker')
    worst=max((r['ratio'] for r in ratios),default=0.0)
    result={'verified':not issues and worst<0.05,'project_id':'016','family':family,'comparisons':len(ratios),'worst_10gram_overlap':worst,'family_preserved':not any('family_mismatch' in x for x in issues),'issues':issues,'spoken_sha256':sha(PROJECT/'story/spoken-narration.txt')}
    (PROJECT/'story/originality-report.json').write_text(json.dumps(result,ensure_ascii=False,indent=2)+'\n')
    print(json.dumps(result,ensure_ascii=False)); return 0 if result['verified'] else 1
if __name__=='__main__': sys.exit(main())
