"""Classify a downloaded SEARCH KOREA portability CSV. Standard library only.
Usage: python portability-audit.py INPUT.csv OUTPUT.csv
This reuses published editorial definitions, not product execution results.
"""
import csv,sys
from pathlib import Path
GROUPS={
 'export':('반출 경로','사본 확보'), 'coverage':('포함 범위','누락 파악'),
 'restore':('재구성','계속 사용'), 'offboarding':('종료 절차','업무 인계'),
 'notion-pdf':('형식·요금제','열람'), 'notion-formats':('댓글·편집 파일','열람과 편집 구분'),
 'notion-views':('데이터베이스 보기','구조 인계'), 'ms-contract':('계약','종료 비용'),
 'ms-delete':('삭제','사본·인수 선행'), 'google-export-owner':('소유·권한','조직 자료 인계'),
 'google-cloud-identity':('계정·편집','공동 업무 지속'), 'google-contract':('계약','종료 비용')
}
def classify(rows):
 result=[];seen=set()
 for row in rows:
  key=(row['제품 코드'],row['비교 항목 코드'])
  if key in seen:raise ValueError('중복 관측 단위: '+str(key))
  seen.add(key)
  if key[1] not in GROUPS:raise ValueError('정의되지 않은 코드: '+key[1])
  group,decision=GROUPS[key[1]]
  result.append({'제품 코드':key[0],'비교 항목 코드':key[1],'조건 성격':group,'독자의 판단':decision,'공식 조건':row['공식 조건의 편집 요약'],'원문':row['공식 원문'],'확인일':row['관측일'],'관측 유형':'공식 문서 조사 · 제품 시험 아님'})
 return result
if __name__=='__main__':
 if len(sys.argv)!=3:raise SystemExit(__doc__)
 with open(sys.argv[1],encoding='utf-8-sig',newline='') as f:result=classify(list(csv.DictReader(f)))
 if not result:raise ValueError('자료가 비어 있습니다.')
 with open(sys.argv[2],'x',encoding='utf-8-sig',newline='') as f:
  writer=csv.DictWriter(f,fieldnames=list(result[0]));writer.writeheader();writer.writerows(result)
 print('분류한 공개 조건:',len(result),'/ 제품 성능·성공률·순위의 측정값이 아닙니다.')
