# Features & User Guide

## Feature Overview

SIDES provides the following feature areas:

### 1. Public Dashboard (Map View)

**Route**: `/` or `/dashboard`
**Access**: Public (no auth required)
**Controller**: `MapController::getCurrentData()`

Displays an interactive Leaflet.js map showing all monitoring stations with their current readings:
- Station markers color-coded by status
- Popup showing latest rainfall, water level, and siren data
- Real-time station data from PostgreSQL

### 2. Rainfall Monitoring

**Route**: `/rainfall`
**Access**: Authenticated users
**Controller**: `RainfallController::index()`

- Table showing rainfall data for all rainfall-enabled stations
- Filter by station and date
- Displays: hourly, daily, and 7-day historical values
- Last data update timestamp

### 3. Rainfall Graph

**Route**: `/rainfall/graph/{stationid}`
**Access**: Authenticated users
**Controller**: `RainfallController::rainfallGraph()`

- Interactive chart showing hourly rainfall for the selected station today
- X-axis: time (HH:MM), Y-axis: rainfall value

### 4. Early Warning Threshold (IDF)

**Route**: `/threshold`
**Access**: Authenticated users
**Controller**: `RainfallController::rainfallSum()`

- 6-hour cumulative rainfall data for early warning
- Shows hourly values and timestamps for each of the last 6 hours
- Filter by station and date
- Threshold graph data available via API

### 5. Historical Rainfall

**Route**: `/rainfall/historical`
**Access**: Authenticated users
**Controller**: `RainfallController::historicalRainfall()`

- Detailed hourly rainfall breakdown (24 hours per row)
- Filter by station and date range
- Shows total 24h rainfall per day
- **Export to Excel**: `/rainfall/historical/export`

### 6. Water Level Monitoring

**Route**: `/waterlevel`
**Access**: Authenticated users
**Controller**: `WaterLevelController::index()`

- Table showing current water level readings
- Displays: water level value, alert/warning/danger thresholds
- Filter by station and date
- Interactive water level graph

### 7. Historical Water Level

**Route**: `/waterlevel/historical`
**Access**: Authenticated users
**Controller**: `WaterLevelController::wlHistory()`

- Hourly water level data for a selected station and date
- Shows threshold levels alongside actual readings
- **Export to Excel**: `/waterlevel/historical/export`

### 8. Siren Monitoring

**Route**: `/siren`
**Access**: Authenticated users
**Controller**: `SirenController::index()`

- Current siren status for all siren-equipped stations
- Shows last 3 days of siren activations
- Siren levels: Normal (N), Warning (L), Danger (H)

### 9. Siren History

**Route**: `/sirenhistory`
**Access**: Authenticated users
**Controller**: `SirenController::SirenHistory()`

- Paginated history of all siren activations (excluding Normal)
- **Export to PDF**: `/export/siren-history/pdf`

### 10. Notifications

**Rainfall Notifications**: `/notificationrf`
**Water Level Notifications**: `/notificationwl`
**Siren Notifications**: `/notificationsiren`
**Access**: Authenticated users
**Controller**: `NotificationController`

- Shows today's threshold-triggered notifications
- Grouped by type (rainfall, water level, siren)

### 11. Notification History

**Rainfall History**: `/historyrf`
**Water Level History**: `/historywl`
**Access**: Authenticated users
**Controller**: `NotificationController`

- Paginated history of all notifications
- **Export to PDF**:
  - `/export/rainfall-history/pdf`
  - `/export/waterlevel-history/pdf`

### 12. CCTV Links

**Route**: `/cctv`
**Access**: Authenticated users
**Controller**: `cctvController::index()`

- Lists stations with CCTV links (where `cctv_link` is not null and `waterlevel = 1`)
- Links open external CCTV feeds

### 13. Admin: Station Management

**Route**: `/stationmanagement`
**Access**: Admin only (`access_level = 1`)
**Controller**: `AdminController`

- List all stations (paginated, 5 per page)
- Add new station
- Edit station details (name, district, coordinates, type flags, CCTV link)
- Delete station
- Shows station type counts (rainfall, water level, siren)

### 14. Admin: User Management

**Route**: `/usermgmt`
**Access**: Admin only
**Controller**: `AdminController`

- List all users (paginated, 5 per page)
- Add new user
- Edit user details (name, email, access level, block/unblock)
- Reset user password
- Delete user
- Shows user counts by role

### 15. API Endpoints

**Prefix**: `/api/`
**Auth**: Custom login (no token-based auth)

| Endpoint | Method | Description |
|----------|--------|-------------|
| `/api/station/current` | GET | All stations with current data |
| `/api/station/rainfall` | GET | Current rainfall data per station |
| `/api/station/waterlevel` | GET | Current water level data per station |
| `/api/station/notification` | GET | Today's notifications per station |
| `/api/station/history` | GET | 3-day notification history |
| `/api/station/siren` | GET | Current siren status |
| `/api/station/siren/history` | GET | 3-day siren history |
| `/api/login` | POST | Login (username + password) |
| `/api/alert` | POST | Send FCM push notification |

### 16. Profile Management

**Route**: `/profile`
**Access**: Authenticated users
**Controller**: `ProfileController` (Breeze scaffold)

- Update name and email
- Update password
- Delete account

### 17. Localization

**Route**: `/locale/{locale}`
**Access**: Public
**Controller**: `LocaleController`

- Switch between English (`en`) and Bahasa Malaysia (`bm`)
- Persisted in session
- Applied via `LocalizationMiddleware` on every request

### 18. Authentication

**Routes**: `/login`, `/register`, `/forgot-password`, `/reset-password`
**Access**: Guest only (for login/register)
**Scaffold**: Laravel Breeze

- Email/password authentication
- Password reset via email (Gmail SMTP)
- Email verification
- Session-based auth
