# 画面設計書 47-YearInReviewSettings画面

## 概要

本ドキュメントはWikipedia iOSアプリにおけるYear In Review設定画面（YearInReviewSettingsViewController）の設計内容を記載したものです。

### 本画面の処理概要

YearInReviewSettings画面は、Year In Review（年間レビュー）機能の有効/無効を切り替えるための設定画面です。Year In Reviewは、ユーザーの年間の閲覧・編集活動をまとめたパーソナライズされたレポートを提供する機能です。

**業務上の目的・背景**：Year In Review機能はユーザーのWikipedia利用状況を振り返る機能ですが、プライバシー上の理由やストレージ節約のため、この機能を無効にしたいユーザーもいます。本画面でYear In Reviewをオフにすると、保存されたパーソナライズされたインサイトデータが削除され、Year In Reviewが非表示になります。再度オンにすると、データの再収集が開始されます。

**画面へのアクセス方法**：設定画面（Settings）から「Year in Review」項目をタップすることでこの画面に遷移します。

**主要な操作・処理内容**：
1. Year In Review機能のオン/オフ切り替え
2. オフにした場合：保存済みのYear In Reviewレポートデータを削除
3. オンにした場合：Year In Reviewレポートデータの再収集を開始

**画面遷移**：
- 遷移元：Settings画面
- 遷移先：なし（設定変更のみ）

**権限による表示制御**：特になし。すべてのユーザーがこの設定にアクセス可能です。

## 関連機能

| 機能No | 機能名 | 関連種別 | 関連する操作・処理 |
|--------|--------|----------|------------------|
| 54 | Year in Review設定 | 主機能 | Year in Review機能の設定 |

## 画面種別

設定（スイッチ切替型設定画面）

## URL/ルーティング

iOSネイティブアプリのため、URLは使用しない。画面遷移はUINavigationControllerのpush遷移で管理。

## 入出力項目

| 項目名 | 項目ID | データ型 | 入力/出力 | 必須 | 説明 |
|--------|--------|----------|-----------|------|------|
| Year In Review有効 | yearInReviewSettingsIsEnabled | Bool | 入出力 | - | Year In Review機能の有効/無効 |

## 表示項目

| 項目名 | データ型 | 説明 |
|--------|----------|------|
| ナビゲーションタイトル | String | "Year in Review" |
| ヘッダーテキスト | String | 機能説明（オフ時の影響説明） |
| Year in Reviewスイッチ | Switch | 機能の有効/無効 |

## イベント仕様

### 1-Year In Reviewスイッチ切替

Year In Review機能のオン/オフを切り替える際の処理。

1. `userDidTapSwitch(_:)`が呼び出される
2. スイッチのtagからYearInReviewSettingsSwitchItemを特定
3. item.action(sender.isOn)を実行
4. `DonateFunnel.shared.logYearInReviewSettingsDidToggle(isOn:)`でログ記録
5. `dataController.yearInReviewSettingsIsEnabled = isOn`で設定を更新
6. isOnがfalseの場合：`deleteAllYearInReviewReports()`で保存データを削除
7. isOnがtrueの場合：`populateYearInReviewReportData()`でデータ再収集開始

## データベース更新仕様

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

| 操作（イベント） | 対象テーブル | 操作種別 | 概要 |
|----------------|-------------|---------|------|
| Year In Reviewオン | WMFData/CoreData | UPDATE | 設定を有効化、データ収集開始 |
| Year In Reviewオフ | WMFData/CoreData | DELETE | 設定を無効化、保存データ削除 |

### テーブル別更新項目詳細

#### WMFYearInReviewDataController経由

| 操作 | 項目 | 更新値・取得条件 | 備考 |
|-----|------|-----------------|------|
| UPDATE | yearInReviewSettingsIsEnabled | Bool | 設定の有効/無効 |
| DELETE | YearInReviewReport | - | オフ時に全レポート削除 |
| INSERT/UPDATE | YearInReviewReport | 収集データ | オン時にデータ収集 |

## メッセージ仕様

| メッセージID | 種別 | メッセージ内容 | 表示条件 |
|-------------|------|---------------|----------|
| settings-year-in-review-header | ヘッダー | "Turning off Year in Review will clear all stored personalized insights and hide the Year in Review." | セクションヘッダー |

## 例外処理

| 例外条件 | 処理内容 |
|---------|---------|
| dataControllerの初期化失敗 | yearInReviewSettingsIsEnabledがfalseとして扱われる |
| deleteAllYearInReviewReports()失敗 | DDLogErrorでエラーログを記録 |
| populateYearInReviewReportData()失敗 | DDLogErrorでエラーログを記録 |

## 備考

- 本画面はSubSettingsViewControllerを継承
- WMFYearInReviewDataControllerを使用してデータ管理
- DonateFunnelでスイッチ操作をログ記録
- データ削除/収集はTaskで非同期実行
- データ収集にはユーザーID、グローバルユーザーID、言語設定などが使用される

---

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

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

### 推奨読解順序

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

まず、設定項目を表現するデータ構造を理解することが重要です。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 1-1 | YearInReviewSettingsViewController.swift | `Wikipedia/Code/YearInReviewSettingsViewController.swift` | YearInReviewSettingsItemプロトコル（7-12行目） |
| 1-2 | YearInReviewSettingsViewController.swift | `Wikipedia/Code/YearInReviewSettingsViewController.swift` | YearInReviewSettingsSection構造体（19-22行目） |
| 1-3 | YearInReviewSettingsViewController.swift | `Wikipedia/Code/YearInReviewSettingsViewController.swift` | YearInReviewSettingsSwitchItem構造体（24-32行目） |

**読解のコツ**: YearInReviewSettingsSwitchItemがスイッチ項目を表現し、valueCheckerで現在値の取得、actionでスイッチ操作時の処理を定義しています。

#### Step 2: 初期化と依存性を理解する

画面の初期化と依存するコンポーネントを確認します。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 2-1 | YearInReviewSettingsViewController.swift | `Wikipedia/Code/YearInReviewSettingsViewController.swift` | プロパティ定義（36-41行目） |
| 2-2 | YearInReviewSettingsViewController.swift | `Wikipedia/Code/YearInReviewSettingsViewController.swift` | init(dataStore:theme:)（45-48行目） |

**主要処理フロー**:
1. **36行目**: dataStoreの保持
2. **37行目**: sectionsの初期化（空配列）
3. **39行目**: WMFYearInReviewDataControllerのtry?初期化
4. **41行目**: ヘッダーテキストの定義

#### Step 3: セクション構築を理解する

設定画面のセクション構成を確認します。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 3-1 | YearInReviewSettingsViewController.swift | `Wikipedia/Code/YearInReviewSettingsViewController.swift` | updateSections()メソッド（78-107行目） |

**主要処理フロー**:
- **80-101行目**: YearInReviewSettingsSwitchItemの生成
- **80-86行目**: valueCheckerクロージャ - dataControllerから現在値を取得
- **87-100行目**: actionクロージャ - スイッチ操作時の処理
- **88行目**: DonateFunnelでログ記録
- **89行目**: dataControllerの設定を更新
- **90-97行目**: オフ時のデータ削除処理（非同期Task）
- **98-99行目**: オン時のデータ収集開始
- **103行目**: セクションを生成
- **106行目**: tableView.reloadData()

#### Step 4: データ収集処理を理解する

Year In Reviewデータの収集処理を確認します。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 4-1 | YearInReviewSettingsViewController.swift | `Wikipedia/Code/YearInReviewSettingsViewController.swift` | populateYearInReviewReportData()（109-142行目） |

**主要処理フロー**:
- **110-112行目**: 言語コードとカントリーコードの取得
- **113-114行目**: WMFProjectの生成
- **116-141行目**: 非同期Taskでデータ収集
- **119-125行目**: ユーザーID、グローバルユーザーIDの取得
- **128-137行目**: populateYearInReviewReportData()の呼び出し

#### Step 5: スイッチ操作のハンドリングを理解する

ユーザーがスイッチを操作した際の処理フローを確認します。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 5-1 | YearInReviewSettingsViewController.swift | `Wikipedia/Code/YearInReviewSettingsViewController.swift` | userDidTapSwitch(_:)（203-208行目） |

**主要処理フロー**:
- **204行目**: 全セクションからYearInReviewSettingsSwitchItem配列を抽出
- **205行目**: sender.tagに一致する項目を検索
- **206行目**: item.action(sender.isOn)を呼び出し

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

```
YearInReviewSettingsViewController
    │
    ├─ init(dataStore:theme:)
    │      └─ WMFYearInReviewDataController()
    │
    ├─ viewDidLoad()
    │      └─ tableView.register()
    │
    ├─ viewWillAppear()
    │      ├─ updateSections()
    │      └─ configureNavigationBar()
    │
    ├─ updateSections()
    │      └─ YearInReviewSettingsSwitchItem
    │             ├─ valueChecker → dataController.yearInReviewSettingsIsEnabled
    │             └─ action
    │                    ├─ DonateFunnel.logYearInReviewSettingsDidToggle()
    │                    ├─ dataController.yearInReviewSettingsIsEnabled = isOn
    │                    ├─ isOn == false → deleteAllYearInReviewReports()
    │                    └─ isOn == true → populateYearInReviewReportData()
    │
    ├─ tableView(_:cellForRowAt:)
    │      └─ disclosureSwitch設定
    │             └─ addTarget(userDidTapSwitch)
    │
    └─ userDidTapSwitch(_:)
           └─ item.action(sender.isOn)
```

### データフロー図

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

Year In Review ──────────▶ userDidTapSwitch(_:) ─────────────▶ WMFYearInReviewDataController
スイッチ操作                      │
                                  ▼
                           item.action(isOn)
                                  │
                    ┌─────────────┴─────────────┐
                    ▼                           ▼
                isOn = false                 isOn = true
                    │                           │
                    ▼                           ▼
           deleteAllYearInReviewReports()    populateYearInReviewReportData()
                    │                           │
                    ▼                           ▼
             レポートデータ削除          レポートデータ収集開始
                                                │
                                                ▼
                                         userId, globalUserId
                                         language, countryCode
                                         savedSlideDataDelegate
                                         legacyPageViewsDataDelegate
```

### 関連ファイル一覧

| ファイル | パス | 種別 | 役割 |
|---------|------|------|------|
| YearInReviewSettingsViewController.swift | `Wikipedia/Code/YearInReviewSettingsViewController.swift` | ソース | メインのViewController |
| SubSettingsViewController.swift | `Wikipedia/Code/SubSettingsViewController.swift` | ソース | 親クラス（設定画面共通基盤） |
| WMFYearInReviewDataController.swift | `WMFData/Sources/WMFData/DataControllers/WMFYearInReviewDataController.swift` | ソース | Year In Reviewデータ管理 |
| DonateFunnel.swift | `Wikipedia/Code/DonateFunnel.swift` | ソース | ログ記録 |
| WMFSettingsTableViewCell.swift | `Wikipedia/Code/WMFSettingsTableViewCell.swift` | ソース | 設定項目用カスタムセル |
