# MediScan Phase 2: FastAPI 서버 + InsuRo 프론트엔드 연동

## 작업 레벨: Lv.3

## 배경
MediScan Phase 1(파서+분석+리포트) 백엔드 완성. 252개 테스트 PASS.
이제 웹에서 사용할 수 있도록 API 서버 + InsuRo 프론트엔드 연동 필요.

## 프로젝트 코드
- 파서: `/home/jay/projects/MediScan/src/parsers/`
- 분석: `/home/jay/projects/MediScan/src/analysis/`
- 리포트: `/home/jay/projects/MediScan/src/report/`

## 구현 사항

### 1. FastAPI 서버 (`src/api/`)
```
src/api/
├── __init__.py
├── main.py           # FastAPI 앱 + CORS + 라우터
├── routes/
│   ├── __init__.py
│   ├── upload.py     # PDF 업로드 엔드포인트
│   ├── analyze.py    # 분석 시작/결과 조회
│   └── history.py    # 분석 이력 관리
├── deps.py           # 의존성 (JWT 인증, Supabase 클라이언트)
└── config.py         # 환경 설정
```

### 2. API 엔드포인트

#### POST /api/mediscan/upload
- JWT 인증 필수 (InsuRo Supabase JWT)
- 히든 플랜 검증 (sort_order >= 5)
- multipart/form-data로 PDF 4~7개 수신
- 파일 타입 자동 감지 (parsers/__init__.py의 detect_pdf_type)
- 파일을 임시 저장 (암호화) → job_id 반환
- 반환: `{"job_id": "uuid", "files": [{"name": "...", "type": "detail_treatment", "pages": 6}]}`

#### POST /api/mediscan/analyze/{job_id}
- 분석 모드 선택: `{"mode": "standard" | "simplified" | "prediction"}`
- 백그라운드 분석 시작 (BackgroundTasks)
- 반환: `{"status": "processing", "job_id": "..."}`

#### GET /api/mediscan/result/{job_id}
- 분석 결과 조회 (폴링)
- 완료 시: `{"status": "completed", "report_html": "...", "disclosure_text": "...", "summary": {...}}`
- 진행 중: `{"status": "processing", "progress": 60}`

#### GET /api/mediscan/history
- 사용자의 분석 이력 목록
- 반환: `[{"job_id": "...", "created_at": "...", "file_count": 5, "status": "completed"}]`

#### DELETE /api/mediscan/result/{job_id}
- 분석 결과 + 원본 파일 완전 삭제

### 3. InsuRo 프론트엔드 (`/home/jay/projects/InsuRo/src/pages/MediScan.tsx` 교체)

현재 MediScan.tsx는 "서비스 준비 중" 안내 페이지. 이것을 실제 기능 페이지로 교체:

- **파일 업로드 영역**: 드래그&드롭 + 파일 선택, 최대 7개 PDF
- **파일 목록**: 각 PDF의 감지된 타입 표시 (세부진료/처방조제 등)
- **분석 시작 버튼**: 모드 선택 (표준체/간편심사)
- **진행 상태바**: 퍼센트 + 현재 단계
- **결과 뷰어**: HTML 리포트 렌더링 (iframe 또는 dangerouslySetInnerHTML)
- **고지양식 복사 버튼**: 클립보드 복사
- **분석 이력**: 과거 분석 결과 목록

### 4. 보안
- PDF 업로드 시 TLS (HTTPS 기본)
- 서버 측 파일 AES-256 암호화 (환경변수 MEDISCAN_ENCRYPTION_KEY)
- 분석 완료 후 원본 PDF 즉시 삭제
- RLS: 본인 결과만 접근
- 면책 동의: 금소법과 동일 패턴 (useComplianceConsent 재활용 or 별도)

### 5. Supabase 테이블 (마이그레이션)
```sql
CREATE TABLE mediscan_jobs (
  id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
  user_id UUID NOT NULL REFERENCES auth.users(id),
  status TEXT NOT NULL DEFAULT 'uploaded', -- uploaded, processing, completed, failed
  mode TEXT NOT NULL DEFAULT 'standard',
  file_count INT NOT NULL DEFAULT 0,
  progress INT NOT NULL DEFAULT 0,
  report_html TEXT,
  disclosure_text TEXT,
  summary JSONB,
  error_message TEXT,
  created_at TIMESTAMPTZ DEFAULT now(),
  completed_at TIMESTAMPTZ,
  expires_at TIMESTAMPTZ DEFAULT now() + INTERVAL '90 days'
);

ALTER TABLE mediscan_jobs ENABLE ROW LEVEL SECURITY;
CREATE POLICY "Users can manage own jobs" ON mediscan_jobs
  FOR ALL USING (auth.uid() = user_id);
```

## 검증 시나리오
1. Hidden 유저 로그인 → 메디스캔 페이지 → PDF 5개 업로드 → 분석 시작 → 리포트 표시
2. 고지양식 복사 → 클립보드에 텍스트 복사됨
3. 분석 이력에서 과거 결과 조회
4. Free 유저 → 메디스캔 페이지 접근 → "히든 플랜 전용" 안내
5. 분석 완료 후 서버에 원본 PDF 남아있지 않음 확인

## 배포
- FastAPI 서버: InsuRo 서버(server/main.py)에 라우터로 통합 OR 별도 포트
- 권장: InsuRo server/main.py에 `/api/mediscan/` 라우터 마운트 (별도 서버 불필요)

## 참고
- InsuRo MediScan 페이지: `/home/jay/projects/InsuRo/src/pages/MediScan.tsx`
- InsuRo 서버: `/home/jay/projects/InsuRo/server/main.py`
- MediScan 코드: `/home/jay/projects/MediScan/src/`
- 3문서: `/home/jay/workspace/memory/plans/mediscan/`