# task-621.2: 인슈로 플랜 관리 고도화 Phase 2 — 토큰제 + 플랜별 AI 모델

## 프로젝트 경로
`/home/jay/projects/InsuRo/`

## 기술 스택
- React 18 + TypeScript + Vite
- shadcn-ui (Radix UI) + Tailwind CSS
- Supabase (PostgreSQL + Edge Functions)
- TanStack Query

## Phase 1 완료 산출물 (task-621.1)
- DB 마이그레이션: `supabase/migrations/20260316120000_plan_5tier_restructure.sql`
  - 5개 플랜 체계: 무료(1) → 베이직(2) → 프로(3) → 맥스(4) → 히든(5)
  - 엔터프라이즈→맥스 변경, 베이직 재활성화, 프리미엄 비활성화
- `src/hooks/use-user-plan.ts`: PlanTier = "Free" | "Basic" | "Pro" | "Max" | "Hidden"
  - isBasic, isPro, isMax, isHidden 플래그 추가
  - isPremium은 isMax alias (하위호환)
  - normalisePlanTier에 legacy 매핑 (Enterprise→Max, Premium→Pro)
- `src/components/PlanGuard.tsx`: "free" | "basic" | "pro" | "max" 지원
- `src/pages/AdminSubscriptions.tsx`: 3탭 구조 (기능 매트릭스 / 플랜 설정 / 기능 정의 관리)
  - 매트릭스: 행(기능) × 열(플랜), Switch/Input 셀, 일괄 저장
- `src/components/PlanUpgradeDialog.tsx`: 한글 플랜명 + 신규 featureLabels 24개
- isPremium 하드코딩 수정: AiAutomation, AiOnestop, KeywordAnalysis, AppSidebar

## Phase 2 목표
토큰제 + 플랜별 AI 모델 선택 기능을 구현한다.

---

### 2-1. 토큰 관련 DB 테이블 생성
마이그레이션 파일 생성 (`supabase/migrations/` 아래):

```sql
-- 플랜별 토큰 설정
plan_token_config (
  id UUID PRIMARY KEY,
  plan_id UUID REFERENCES subscription_plans(id),
  monthly_token_quota INTEGER NOT NULL,  -- 월간 토큰 할당량 (-1=무제한)
  created_at TIMESTAMPTZ,
  updated_at TIMESTAMPTZ
)

-- 기능별 토큰 소비 설정
feature_token_costs (
  id UUID PRIMARY KEY,
  feature_key TEXT NOT NULL,
  model_tier TEXT NOT NULL,   -- 'haiku', 'sonnet', 'opus' 등
  token_cost INTEGER NOT NULL,
  created_at TIMESTAMPTZ
)

-- 사용자별 토큰 잔액
user_tokens (
  id UUID PRIMARY KEY,
  user_id UUID REFERENCES auth.users(id),
  remaining_tokens INTEGER NOT NULL,
  quota_reset_at TIMESTAMPTZ NOT NULL,
  created_at TIMESTAMPTZ,
  updated_at TIMESTAMPTZ
)

-- 토큰 사용 로그
token_usage_log (
  id UUID PRIMARY KEY,
  user_id UUID REFERENCES auth.users(id),
  feature_key TEXT NOT NULL,
  model_used TEXT NOT NULL,
  tokens_consumed INTEGER NOT NULL,
  created_at TIMESTAMPTZ
)
```
- RLS 정책: 사용자는 자기 토큰/로그만 조회, 관리자는 전체
- 월 초 자동 리셋 함수 (Supabase Edge Function 또는 pg_cron)

### 2-2. 플랜별 AI 모델 선택 테이블
```sql
plan_ai_models (
  id UUID PRIMARY KEY,
  plan_id UUID REFERENCES subscription_plans(id),
  feature_key TEXT NOT NULL,
  model_tier TEXT NOT NULL,   -- 'haiku', 'sonnet', 'opus'
  model_name TEXT,
  created_at TIMESTAMPTZ
)
```
- 기본 모델 매핑 시드 데이터:
  - 무료: haiku, 베이직: sonnet, 프로: sonnet, 맥스: opus, 히든: opus

### 2-3. 관리자 UI
- AdminSubscriptions 매트릭스에 "토큰 설정" 탭/섹션 추가:
  - 플랜별 월간 토큰 할당량 설정
  - 기능별 × 모델별 토큰 소비량 설정
  - 플랜별 AI 모델 선택 드롭다운

### 2-4. 사용자 UI
- 대시보드 또는 마이페이지에 잔여 토큰 표시
- AI 기능 사용 시 토큰 잔액 확인 → 부족 시 업그레이드 유도
- 토큰 사용 이력 조회

## 참조 파일
- `/home/jay/projects/InsuRo/src/pages/AdminAIConfig.tsx` — AI 설정
- `/home/jay/projects/InsuRo/src/pages/AdminSubscriptions.tsx` — Phase 1에서 개편한 관리 페이지 (3탭 구조)
- `/home/jay/projects/InsuRo/supabase/functions/_shared/ai-provider.ts` — AI 엔진 추상화
- `/home/jay/projects/InsuRo/supabase/combined-migration.sql` — DB 스키마 참조
- 마스터플랜: `/home/jay/workspace/memory/tasks/task-621.1.md` (Phase 2 섹션)

## 공통 규칙
- InsuRo 프로젝트는 `/home/jay/projects/InsuRo/`에 위치
- Supabase 마이그레이션은 `supabase/migrations/` 아래에 타임스탬프 prefix로 생성
- 기존 컴포넌트/훅 스타일과 일관성 유지 (shadcn-ui, TanStack Query)
- RLS 정책 반드시 설정
- TypeScript strict mode 준수

## 보고서
- 경로: `/home/jay/workspace/memory/reports/task-621.2.md`
- 완료: `bash /home/jay/workspace/scripts/finish-task.sh task-621.2`