# Tóm tắt cập nhật Training Interface & API

## 📋 Những gì đã cập nhật

### 1. **Backend API (api_server.py)**

#### ✅ Cập nhật giá trị mặc định từ 01.train_ODC.ipynb:
- **Bbox mới**: `[105.5, 9.2, 106.4, 10.0]` (thay vì `[105.6, 9.3, 106.2, 9.8]`)
- **Thời gian mới**: `2023-03-01` → `2023-12-31` (thay vì `2023-03-01` → `2023-05-31`)

#### ✅ Thêm Label Mapping Constants:
```python
DEFAULT_LABEL_MAPPING = {
    "Lua tom": "0",
    "Lua": "1", 
    "CHN": "2",
    "CLN": "3",
    "TS": "4",
    "Song": "5",
    "Dat xay dung": "6",
    "Rung": "7",
}
```

#### ✅ API Endpoints mới:

**1. `GET /api/training/labels`**
- Trả về danh sách tất cả labels và label mapping
- Response:
```json
{
  "label_mapping": {...},
  "label_names": {...},
  "count": 8,
  "labels": [...]
}
```

**2. `GET /api/training/files`**
- List tất cả shapefile trong thư mục `/train`
- Hiển thị: filename, size, số điểm, label column, unique labels
- Response:
```json
{
  "files": [
    {
      "filename": "ST_training data_updated_1130points_new.shp",
      "path": "train/...",
      "size_mb": 0.15,
      "point_count": 1130,
      "label_column": "Hientrang",
      "unique_labels": [...],
      "label_count": 8
    }
  ],
  "count": 2,
  "directory": "train/"
}
```

**3. `GET /api/training/shapefile/{filename}/labels`**
- Đọc chi tiết labels từ một shapefile cụ thể
- Trả về: số điểm, unique labels, label counts, bbox, columns
- Response:
```json
{
  "filename": "...",
  "label_column": "Hientrang",
  "point_count": 1130,
  "unique_labels": [...],
  "label_count": 8,
  "labels": [
    {
      "name": "Lua tom",
      "code": "0",
      "count": 150,
      "mapped": true
    },
    ...
  ],
  "bbox": [105.5, 9.2, 106.4, 10.0],
  "columns": [...]
}
```

#### ✅ Cập nhật Presets:
- Preset 1: "PC - Nhỏ" với bbox mới
- Preset 2: "Server - Trung bình" với bbox mới
- Preset 3: "Full - ODC" - PRESET MỚI từ 01.train_ODC.ipynb
  - Bbox: `[105.5, 9.2, 106.4, 10.0]`
  - Time: `2023-03-01` → `2023-12-31`
  - Max scenes: 1
  - Resolution: 10m

---

### 2. **Frontend UI (training_interface.html)**

#### ✅ Cập nhật giá trị mặc định trong form:
- **Hidden inputs bbox**: 
  - `minLon: 105.5, minLat: 9.2, maxLon: 106.4, maxLat: 10.0`
- **Date inputs**:
  - `startDate: 2023-03-01, endDate: 2023-12-31`

#### ✅ Thêm section "Training Data (Shapefile)":
```html
<h3>📊 Training Data (Shapefile)</h3>
<select id="trainingShapefile">...</select>
```

Features:
- Dropdown chọn shapefile từ thư mục `/train`
- Tự động load default: `ST_training data_updated_1130points_new.shp`
- Hiển thị thông tin: số điểm, label column, số lớp, bbox

#### ✅ Thêm phần hiển thị thông tin Shapefile:
```html
<div id="shapefileInfo">
  - Số điểm
  - Label column
  - Số lớp
  - Bbox
  - Phân bố labels (với icon ✅/⚠️)
  - Button "Áp dụng Bbox từ Shapefile"
</div>
```

#### ✅ JavaScript Functions mới:

**1. `loadTrainingFiles()`**
- Load danh sách shapefile từ API
- Populate dropdown
- Auto-select default shapefile

**2. `loadShapefileLabels(filename)`**
- Load chi tiết labels từ shapefile
- Hiển thị phân bố labels
- Highlight labels đã map vs chưa map

**3. `applyShapefileBbox()`**
- Áp dụng bbox từ shapefile đã chọn
- Cập nhật form inputs
- Vẽ rectangle trên map
- Hiển thị notification

**4. `showNotification(type, message)`**
- Helper function để hiển thị notifications
- Support types: success, error, warning

#### ✅ Cập nhật form submission:
- Thêm `training_shapefile` vào config
- Default: `train/ST_training data_updated_1130points_new.shp`

#### ✅ Event listeners:
```javascript
document.getElementById('trainingShapefile').addEventListener('change', 
  (e) => loadShapefileLabels(e.target.value)
);
```

---

### 3. **Bản đồ (Map)**

#### ✅ Initial rectangle với bbox mới:
- Tự động vẽ rectangle với bbox từ backend
- Fit map bounds để hiển thị khu vực

#### ✅ Dynamic update từ shapefile:
- Khi chọn shapefile → có thể áp dụng bbox
- Màu khác biệt (xanh dương) để dễ nhận biết

---

## 🧪 Test Script

File `test_training_api.py` để test các endpoints:

```bash
# Run API server (terminal 1)
conda activate env_01
python api_server.py

# Run test script (terminal 2)
conda activate env_01
python test_training_api.py
```

Test coverage:
1. ✅ GET /api/training/labels
2. ✅ GET /api/training/files
3. ✅ GET /api/training/shapefile/{filename}/labels
4. ✅ GET /api/config/presets

---

## 📊 Workflow mới

### Cách sử dụng trên giao diện:

1. **Mở Training Interface**: http://localhost:8000/training

2. **Chọn Training Data**:
   - Chọn shapefile từ dropdown "📊 Training Data"
   - Xem thông tin: số điểm, labels, bbox
   - (Optional) Click "📍 Áp dụng Bbox từ Shapefile"

3. **Chọn Khu vực**:
   - Option 1: Chọn tỉnh thành
   - Option 2: Vẽ rectangle trên map
   - Option 3: Áp dụng bbox từ shapefile
   - Option 4: Chọn preset

4. **Cấu hình thời gian và parameters**:
   - Thời gian mặc định: 2023-03-01 → 2023-12-31
   - Bbox mặc định: [105.5, 9.2, 106.4, 10.0]

5. **Start Training**:
   - Form tự động gửi `training_shapefile` parameter
   - Backend sẽ dùng đúng shapefile đã chọn

---

## 🎯 Kết quả

### ✅ Backend:
- 3 API endpoints mới hoạt động
- Default values khớp với notebook
- Label mapping được share

### ✅ Frontend:
- UI mới để chọn shapefile
- Hiển thị chi tiết labels
- Auto-load default shapefile
- Bbox từ shapefile có thể áp dụng

### ✅ Map:
- Initial bbox khớp với backend
- Update bbox từ nhiều nguồn
- Visual feedback rõ ràng

---

## 🔍 Debug & Verify

### Check API:
```bash
# List training files
curl http://localhost:8000/api/training/files

# Get labels
curl http://localhost:8000/api/training/labels

# Get shapefile labels
curl "http://localhost:8000/api/training/shapefile/ST_training data_updated_1130points_new.shp/labels"
```

### Check Browser Console:
- F12 → Console
- Xem logs khi chọn shapefile
- Check network requests

---

## 📝 Notes

1. **Training shapefile path format**:
   - Frontend select value: `ST_training data_updated_1130points_new.shp`
   - Backend receives: `train/ST_training data_updated_1130points_new.shp`
   - Auto-prepend `train/` prefix in form submission

2. **Label mapping**:
   - ✅ icon: Label có trong DEFAULT_LABEL_MAPPING
   - ⚠️ icon: Label chưa có trong mapping

3. **Bbox sources**:
   - Default từ backend
   - Từ tỉnh thành
   - Từ shapefile
   - Từ preset
   - Vẽ thủ công

Tất cả đều hoạt động đồng bộ!
