# 機能設計書 54-Year in Review設定

## 概要

本ドキュメントは、Wikipedia iOSアプリにおけるYear in Review設定機能の設計を記述する。この機能は、ユーザーがYear in Review機能の有効/無効を切り替えるための設定画面を提供する。

### 本機能の処理概要

**業務上の目的・背景**：Year in Review機能はパーソナライズされた統計情報を表示するため、一部のユーザーはプライバシーの観点からこの機能を無効にしたい場合がある。また、興味のないユーザーはExplore画面のカードを非表示にしたい場合もある。設定画面を提供することで、ユーザーがこの機能を自分の好みに合わせて制御できるようにする。

**機能の利用シーン**：設定画面からYear in Review設定にアクセスし、トグルスイッチで機能の有効/無効を切り替える。無効にするとパーソナライズされた統計情報が削除され、Year in Reviewカードが非表示になる。

**主要な処理内容**：
1. 現在のYear in Review設定状態の表示
2. トグルスイッチによる有効/無効切り替え
3. 無効時の年間レポートデータ削除
4. 有効時のレポートデータ再生成
5. 設定変更のログ記録

**関連システム・外部連携**：
- WMFYearInReviewDataController（設定管理、データ削除/生成）
- UserDefaults経由の設定永続化

**権限による制御**：特別な権限は不要。

## 関連画面

| 画面No | 画面名 | 関連種別 | 関連する操作・処理 |
|--------|--------|----------|------------------|
| 26 | SettingsTableViewController | 親画面 | 設定画面からの遷移 |

## 機能種別

設定管理 / CRUD操作（設定値の読み書き）

## 入力仕様

### 入力パラメータ

| パラメータ名 | 型 | 必須 | 説明 | バリデーション |
|-------------|-----|-----|------|---------------|
| dataStore | MWKDataStore | Yes | データストア | nil不可 |
| theme | Theme | Yes | 現在のテーマ | nil不可 |

### 入力データソース

ユーザーのトグルスイッチ操作

## 出力仕様

### 出力データ

| 項目名 | 型 | 説明 |
|--------|-----|------|
| yearInReviewSettingsIsEnabled | Bool | Year in Review有効状態 |

### 出力先

UserDefaults、Year in Reviewレポートデータベース

## 処理フロー

### 処理シーケンス

```
1. 設定画面表示
   └─ YearInReviewSettingsViewController表示
2. 現在の設定読み込み
   └─ dataController.yearInReviewSettingsIsEnabled
3. テーブルビュー表示
   └─ ヘッダーテキストとトグルセル表示
4. トグル切り替え
   └─ userDidTapSwitch()が呼ばれる
5a. OFFに変更時
   └─ deleteAllYearInReviewReports()でデータ削除
5b. ONに変更時
   └─ populateYearInReviewReportData()でデータ生成
6. 設定保存
   └─ yearInReviewSettingsIsEnabled = isOn
7. ログ記録
   └─ DonateFunnel.shared.logYearInReviewSettingsDidToggle()
```

### フローチャート

```mermaid
flowchart TD
    A[設定画面表示] --> B[現在設定読み込み]
    B --> C[テーブル表示]
    C --> D[トグルスイッチ操作]
    D --> E{ON or OFF?}
    E -->|ON| F[レポートデータ生成]
    E -->|OFF| G[レポートデータ削除]
    F --> H[設定保存]
    G --> H
    H --> I[ログ記録]
    I --> J[テーブル更新]
```

## ビジネスルール

### 業務ルール

| ルールNo | ルール名 | 内容 | 適用条件 |
|---------|---------|------|---------|
| BR-54-01 | データ削除 | OFF時にすべてのYiRレポートを削除 | 設定をOFFに変更時 |
| BR-54-02 | データ再生成 | ON時に新規レポートを生成 | 設定をONに変更時 |
| BR-54-03 | 情報開示 | 設定による影響をヘッダーで説明 | 設定画面表示時 |

### 計算ロジック

特になし

## データベース操作仕様

### 操作別データベース影響一覧

| 操作 | 対象テーブル | 操作種別 | 概要 |
|-----|-------------|---------|------|
| 設定OFF | YearInReviewReport | DELETE | 全レポートデータ削除 |
| 設定ON | YearInReviewReport | INSERT | レポートデータ新規生成 |

## エラー処理

### エラーケース一覧

| エラーコード | エラー種別 | 発生条件 | 対処方法 |
|------------|----------|---------|---------|
| deleteError | データ削除エラー | レポート削除失敗 | ログ記録のみ（DDLogError） |
| populateError | データ生成エラー | レポート生成失敗 | ログ記録のみ |

### リトライ仕様

なし（エラーはログ記録のみ）

## トランザクション仕様

Core Dataコンテキストでレポート削除/生成を管理

## パフォーマンス要件

レポート削除/生成は非同期（Task）で実行

## セキュリティ考慮事項

- パーソナライズデータはOFF時に完全削除
- 設定状態はローカルに保存

## 備考

ヘッダーテキストで設定の影響を説明し、ユーザーが理解した上で選択できるようにする。

---

## コードリーディングガイド

本機能を理解するために参照すべきファイルと、推奨する読み解き順序を以下に示す。

### 推奨読解順序

#### Step 1: データ構造を理解する

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 1-1 | YearInReviewSettingsSection | `Wikipedia/Code/YearInReviewSettingsViewController.swift` | セクション構造体 |
| 1-2 | YearInReviewSettingsSwitchItem | `Wikipedia/Code/YearInReviewSettingsViewController.swift` | トグル項目構造体 |

**読解のコツ**: プロトコル`YearInReviewSettingsItem`でアイテムの共通インターフェースを定義

#### Step 2: エントリーポイントを理解する

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 2-1 | YearInReviewSettingsViewController.swift | `Wikipedia/Code/YearInReviewSettingsViewController.swift` | メインコントローラ |

**主要処理フロー**:
1. **45-52行目**: init() - 初期化
2. **54-61行目**: viewDidLoad() - テーブル設定
3. **78-107行目**: updateSections() - セクションデータ構築
4. **203-208行目**: userDidTapSwitch() - トグル操作ハンドリング

#### Step 3: データ操作を理解する

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 3-1 | WMFYearInReviewDataController | `WMFData/` | データ管理 |

**主要処理フロー**:
- **89行目**: dataController.yearInReviewSettingsIsEnabled = isOn - 設定保存
- **93行目**: deleteAllYearInReviewReports() - データ削除
- **99行目**: populateYearInReviewReportData() - データ生成

### プログラム呼び出し階層図

```
SettingsTableViewController
    │
    └─ YearInReviewSettingsViewController
           ├─ viewDidLoad()
           │      └─ tableView.register()
           │
           ├─ viewWillAppear()
           │      └─ updateSections()
           │             └─ YearInReviewSettingsSwitchItem構築
           │
           └─ userDidTapSwitch()
                  ├─ DonateFunnel.logYearInReviewSettingsDidToggle()
                  ├─ dataController.yearInReviewSettingsIsEnabled = isOn
                  │
                  ├─ [OFF時] deleteAllYearInReviewReports()
                  │
                  └─ [ON時] populateYearInReviewReportData()
```

### データフロー図

```
[入力]               [処理]                    [出力]

トグル ───▶ userDidTapSwitch() ───▶ WMFYearInReviewDataController
スイッチ        │                          │
               │                          ▼
               │                   yearInReviewSettingsIsEnabled
               │                          │
               │                          ▼
               │               deleteAllYearInReviewReports()
               │                    or
               │               populateYearInReviewReportData()
               │                          │
               ▼                          ▼
        DonateFunnel.log() ───▶ Core Data / UserDefaults
```

### 関連ファイル一覧

| ファイル | パス | 種別 | 役割 |
|---------|------|------|------|
| YearInReviewSettingsViewController.swift | `Wikipedia/Code/` | ソース | 設定画面コントローラ |
| WMFYearInReviewDataController.swift | `WMFData/` | ソース | データ管理 |
| WMFSettingsTableViewCell.swift | `WMF Framework/` | ソース | 設定セルUI |
| DonateFunnel.swift | `Wikipedia/Code/` | ソース | ログ記録 |
| SubSettingsViewController.swift | `Wikipedia/Code/` | ソース | 親クラス |
