# 安全庫存設定頁面 - 功能規格文件

## 頁面概述
單一倉庫為單位管理各商品的安全庫存量。初版使用 mock data 呈現，不涉及實際 API 串接。

## 頁面定位
- 路徑：`/safety-stock`
- 標題：`[倉庫名稱] – 安全庫存設定`（例如：A 倉庫 – 安全庫存設定）
- 僅顯示該倉庫中「曾有庫存紀錄的商品」

---

## 頁面架構

### 1. 頂部區塊

#### 1.1 標題與說明
- **倉庫名稱**：顯眼標題（h1）
- **說明文字**：「僅顯示本倉庫曾有庫存紀錄的商品。安全庫存用於判斷庫存不足與缺貨提醒。」

#### 1.2 搜尋欄位
- 輸入框：可搜尋商品名稱、商品編號或條碼
- 圖標：搜尋圖標（Search icon）
- Placeholder：「搜尋商品名稱、商品編號或條碼」

#### 1.3 篩選條件
下拉選單，包含以下選項：
- **全部商品**：顯示所有商品（預設）
- **已設定安全庫存**：只顯示 `safetyStock !== null` 的商品
- **有異常狀態**：只顯示「低於安全庫存」或「缺貨」狀態的商品

---

### 2. 列表區塊

#### 2.1 表格欄位
| 欄位名稱 | 說明 | 資料型態 | 顯示範例 |
|---------|------|---------|---------|
| 商品名稱 | 商品的名稱 | 文字 | 高筋麵粉 |
| 商品編號 | 商品的編號 | 文字 | P001 |
| 目前庫存 | 此倉庫的庫存數量 + 單位 | 數字 + 單位 | 150 kg |
| 安全庫存量 | 設定的安全庫存數量 | 數字 + 單位 或 "—" | 50 kg / — |
| 狀態 | 依據規則計算的狀態 | Badge | 正常 / 低於安全庫存 / 缺貨 / 未設定 |
| 操作 | 操作按鈕 | 按鈕 | 設定（outline button） |

#### 2.2 狀態計算規則
```
未設定：safetyStock === null
正常：safetyStock !== null && currentStock >= safetyStock
低於安全庫存：safetyStock !== null && currentStock > 0 && currentStock < safetyStock
缺貨：currentStock === 0 && safetyStock !== null
```

#### 2.3 狀態顏色
- **未設定**：灰色 Border Badge
- **正常**：綠色 Border Badge
- **低於安全庫存**：琥珀色 Border Badge
- **缺貨**：紅色 Border Badge

#### 2.4 特性
- 表格中的欄位全部為**唯讀**狀態
- **不提供** inline 編輯功能
- 所有修改必須透過「設定」按鈕開啟彈窗完成

---

### 3. 安全庫存設定彈窗（Modal）

#### 3.1 觸發方式
使用者點擊表格某一列的「設定」按鈕

#### 3.2 彈窗標題
```
設定安全庫存 – [商品名稱]（[倉庫名稱]）
```
範例：`設定安全庫存 – 高筋麵粉（A 倉庫）`

#### 3.3 彈窗欄位

##### 唯讀欄位（顯示用）
- 商品名稱
- 商品編號
- 倉庫名稱
- 目前庫存（含單位）

##### 可編輯欄位
- **安全庫存量**（數字輸入框）
  - 類型：正整數
  - 驗證：不得為負數或非數字
  - 預設值：若已設定過安全庫存，帶入原數值
  - 清空代表取消安全庫存設定

#### 3.4 輔助文字
「當本倉庫庫存量低於安全庫存時，系統會顯示庫存不足提醒。」

#### 3.5 按鈕
- **取消**（outline button）：關閉彈窗，不儲存變更
- **儲存設定**（filled button）：套用新的安全庫存數值

---

## 驗證與提示

### 4.1 輸入驗證
- 安全庫存量不得為負數
- 安全庫存量不得為非數字
- 必須為整數
- 若不合法，顯示錯誤訊息於輸入框下方

### 4.2 取消設定確認
當使用者清空安全庫存量欄位並按下儲存時：
- 顯示確認提示（AlertDialog）
- 標題：「確認取消安全庫存設定」
- 內容：「是否確認取消此商品在本倉庫的安全庫存設定？」
- 按鈕：
  - 取消（outline）
  - 確認取消設定（filled）

### 4.3 成功提示
- 儲存成功後關閉彈窗
- 顯示 toast 訊息
- 列表中該商品的「安全庫存量」與「狀態」即時更新

---

## Mock Data 結構

```typescript
interface SafetyStockItem {
  productId: string;        // 商品 ID
  productCode: string;      // 商品編號
  productName: string;      // 商品名稱
  productBarcode: string;   // 商品條碼
  unit: string;            // 單位（kg, L, 顆, mL 等）
  currentStock: number;     // 目前庫存
  safetyStock: number | null; // 安全庫存量（null 表示未設定）
}

interface SafetyStockSetting {
  warehouseId: string;      // 倉庫 ID
  warehouseName: string;    // 倉庫名稱
  items: SafetyStockItem[]; // 商品列表
}
```

### 範例資料
```typescript
const MOCK_ITEMS: SafetyStockItem[] = [
  {
    productId: "prod-001",
    productCode: "P001",
    productName: "高筋麵粉",
    productBarcode: "4710001234567",
    unit: "kg",
    currentStock: 150,
    safetyStock: 50,  // 狀態：正常
  },
  {
    productId: "prod-002",
    productCode: "P002",
    productName: "細砂糖",
    productBarcode: "4710001234568",
    unit: "kg",
    currentStock: 30,
    safetyStock: 50,  // 狀態：低於安全庫存
  },
  {
    productId: "prod-003",
    productCode: "P003",
    productName: "無鹽奶油",
    productBarcode: "4710001234569",
    unit: "kg",
    currentStock: 0,
    safetyStock: 20,  // 狀態：缺貨
  },
  {
    productId: "prod-004",
    productCode: "P004",
    productName: "動物鮮奶油",
    productBarcode: "4710001234570",
    unit: "L",
    currentStock: 45,
    safetyStock: null,  // 狀態：未設定
  },
];
```

---

## 設計規範遵循

### Guidelines 遵循
- ✅ **主要按鈕**（儲存設定、確認取消設定）：使用 **filled button class**
- ✅ **次要按鈕**（取消、設定、返回）：使用 **outlined button class**
- ✅ **輸入欄位**：使用 **Outlined style** 的 border/outline
- ✅ **對比度**：所有按鈕的背景色與文字色具備足夠對比度

### 使用者體驗原則
1. **安全性**：刪除/取消操作需要二次確認
2. **即時反饋**：操作成功後立即更新 UI 並顯示 toast
3. **錯誤處理**：輸入驗證錯誤即時顯示於輸入框下方
4. **一致性**：與系統其他頁面保持一致的操作邏輯

---

## 技術實作重點

### 元件組成
- `SafetyStockPage.tsx`：主頁面元件
- 使用的 UI 元件：
  - `Button`（filled / outline variants）
  - `Input`（outlined style）
  - `Select`（下拉篩選）
  - `Dialog`（設定彈窗）
  - `AlertDialog`（確認對話框）
  - `Badge`（狀態標籤）
  - `Label`（表單標籤）

### 狀態管理
- `items`：商品列表資料
- `searchQuery`：搜尋關鍵字
- `filterType`：篩選類型（all / withSafety / abnormal）
- `selectedItem`：當前選中要設定的商品
- `isDialogOpen`：彈窗開啟狀態
- `safetyStockValue`：彈窗中的安全庫存輸入值
- `showClearConfirm`：取消設定確認對話框狀態
- `error`：輸入驗證錯誤訊息

### 核心功能
1. **搜尋**：依商品名稱、編號、條碼進行即時搜尋
2. **篩選**：依狀態類型過濾商品列表
3. **開啟設定彈窗**：點擊設定按鈕，帶入商品資料
4. **輸入驗證**：正整數驗證、錯誤訊息顯示
5. **儲存設定**：更新 mock data 並即時反映於列表
6. **取消設定**：清空輸入框時顯示確認對話框
7. **狀態計算**：依據邏輯計算並顯示對應的狀態 Badge

---

## 未來擴展方向
- [ ] 實際 API 串接
- [ ] 批次設定功能
- [ ] 匯出安全庫存設定報表
- [ ] 歷史變更記錄
- [ ] 多倉庫切換功能
