# 開発ステップ (Development Steps)

[SPEC_01_画面機能仕様書](../04_SPEC/SPEC_01_画面機能仕様書.md) の仕様をもとに，実装の順序とステップを定義する．
各ステップは 1 つのブランチ・PR に対応させる．

## ステップ一覧 (Overview)

| # | ステップ | 概要 | 依存 |
| --- | --- | --- | --- |
| 1 | プロジェクト基盤 | アプリ骨格，テーマ，画面遷移，Provider 登録 | — |
| 2 | カメラプレビュー | インカメラのライブプレビュー表示（180° 回転） | 1 |
| 3 | 撮影・保存 | シャッターボタン，PNG 保存，ファイル命名 | 2 |
| 4 | 一覧・削除 | サムネイルグリッド，拡大表示，画像削除 | 3 |
| 5 | 仕上げ | パーミッション UX 改善，エラーハンドリング，手動テスト | 4 |

## Step 1: プロジェクト基盤 (App Foundation)

### 目的

アプリの骨格を構築し，画面遷移が動作する状態にする．

### 実装内容

- `main.dart` — `runApp()` で Provider を登録し，アプリを起動する
- `app.dart` — `MaterialApp` の定義，テーマ設定
- `screens/capture_screen.dart` — 撮影画面の空のスキャフォールド
- `screens/gallery_screen.dart` — 一覧画面の空のスキャフォールド
- `BottomNavigationBar` による 2 タブ切り替え
- UI 全体の 180° 回転（`Transform.rotate`）

### 完了基準

- アプリが起動し，2 つのタブで画面を切り替えられる
- UI が 180° 回転して表示される
- `dart analyze` / `dart format` がクリーン

### ブランチ名

`feature/app-foundation`

## Step 2: カメラプレビュー (Camera Preview)

### 目的

インカメラのライブプレビューを撮影画面に表示する．

### 実装内容

- `services/permission_service.dart` — カメラ権限の確認・要求
- `providers/camera_provider.dart` — カメラの初期化・プレビュー制御・ライフサイクル管理
- `widgets/camera_preview.dart` — `CameraPreview` ウィジェット
- `screens/capture_screen.dart` — カメラプレビューの組み込み
- パーミッション拒否時のエラー表示（基本的なメッセージのみ）

### 完了基準

- 撮影画面でインカメラのライブプレビューが表示される
- アプリをバックグラウンド→復帰してもカメラが正常に動作する
- カメラ権限の拒否時にメッセージが表示される

### ブランチ名

`feature/camera-preview`

## Step 3: 撮影・保存 (Capture & Save)

### 目的

シャッターボタンで撮影し，PNG 形式でストレージに保存する．

### 実装内容

- `services/file_service.dart` — PNG 保存，ファイル名生成，重複回避ロジック
- `widgets/shutter_button.dart` — シャッターボタン UI
- `providers/camera_provider.dart` — 撮影実行メソッドの追加
- `screens/capture_screen.dart` — シャッターボタンの組み込み，撮影成功時のスナックバー
- ストレージ権限の確認・要求
- MediaStore への通知

### テスト

- `FileService` のファイル名生成ロジックの Unit テスト
- `FileService` の重複回避ロジックの Unit テスト

### 完了基準

- シャッターボタンタップで撮影できる
- `Pictures/MiniTIAS/` に `MiniTIAS_YYYYMMDD_HHmmss.png` 形式で保存される
- 連続撮影で同秒の場合，連番サフィックスが付与される
- 撮影成功時にスナックバーが表示される

### ブランチ名

`feature/capture-save`

## Step 4: 一覧・削除 (Gallery & Delete)

### 目的

撮影済み画像の一覧表示，拡大確認，削除機能を実装する．

### 実装内容

- `providers/gallery_provider.dart` — 画像一覧の取得・キャッシュ・削除操作
- `widgets/image_grid.dart` — 3 列サムネイルグリッド
- `widgets/image_detail_dialog.dart` — 拡大表示ダイアログ（ピンチズーム，削除ボタン）
- `screens/gallery_screen.dart` — グリッド・ダイアログの組み込み，空状態メッセージ

### テスト

- `GalleryProvider` の一覧取得・削除ロジックの Unit テスト

### 完了基準

- 一覧画面に撮影済み画像がサムネイルで表示される（新しい順）
- サムネイルタップで拡大表示ダイアログが開く
- ダイアログ内の削除ボタンで画像を削除できる（確認ダイアログあり）
- 画像 0 件時に空状態メッセージが表示される

### ブランチ名

`feature/gallery-delete`

## Step 5: 仕上げ (Polish)

### 目的

パーミッション UX の改善，エラーハンドリングの強化，全体の動作確認を行う．

### 実装内容

- パーミッション拒否時の設定画面誘導ボタン
- 各種エラー時のスナックバー表示の統一
- 撮影画面↔一覧画面切り替え時のデータリフレッシュ

### テスト

- 全 Unit / Widget テストの通過確認
- [GUIDE_06](../01_GUIDE/GUIDE_06_テスト方針.md) の手動確認項目を実機で確認

### 完了基準

- GUIDE_06 の手動確認項目がすべて OK
- `dart analyze` / `flutter test` がクリーン
- 白板・舌模型の撮影ができ，PC から USB 経由で画像にアクセスできる

### ブランチ名

`feature/polish-permissions`
