# 📺 FEATURE 1: SCREEN MIRROR - Dokumentasi

## Deskripsi
Screen Mirror memungkinkan user di dashboard untuk melihat live screenshot dari PC target yang sedang di-monitor. Screenshots tersimpan di server dan bisa diakses/diunduh kapan saja.

---

## 🏗️ Arsitektur

### Database
```sql
CREATE TABLE screenshots (
    id INT PRIMARY KEY AUTO_INCREMENT,
    agent_id VARCHAR(50) NOT NULL,
    screenshot_path VARCHAR(500),
    file_size INT,
    captured_at TIMESTAMP,
    created_at TIMESTAMP,
    FOREIGN KEY (agent_id) REFERENCES agents(agent_id)
);
```

### Directory Structure
```
/tracker/
├── screenshots/
│   └── {agent_id}/         (per-agent folder)
│       ├── screenshot_1234567890.png   (timestamp-based)
│       ├── screenshot_1234567891.png
│       └── ...
├── api/
│   └── controllers/
│       └── ScreenshotController.php
└── dashboard/
    └── views/
        └── screenshot.php
```

---

## 📡 API Endpoints

### 1. SAVE Screenshot (Agent → Server)
**Endpoint:** `POST /api/screenshot`

**Request:**
```json
{
    "agent_id": "117295468",
    "screenshot_base64": "iVBORw0KGgoAAAANS...",  // Base64 encoded screenshot
    "captured_at": "2026-03-28 15:30:00"
}
```

**Response:**
```json
{
    "success": true,
    "message": "Screenshot saved",
    "path": "/screenshots/117295468/screenshot_1234567890.png"
}
```

### 2. GET Latest Screenshot
**Endpoint:** `GET /api/screenshot?agent_id=117295468`

**Response:**
```json
{
    "success": true,
    "data": {
        "id": 1,
        "agent_id": "117295468",
        "screenshot_path": "/screenshots/117295468/screenshot_1234567890.png",
        "file_size": 102400,
        "captured_at": "2026-03-28 15:30:00"
    }
}
```

### 3. GET Screenshot History
**Endpoint:** `GET /api/screenshot?agent_id=117295468&type=history&limit=10`

**Response:**
```json
{
    "success": true,
    "data": [
        {
            "id": 1,
            "agent_id": "117295468",
            "screenshot_path": "/screenshots/117295468/screenshot_1234567890.png",
            "file_size": 102400,
            "captured_at": "2026-03-28 15:30:00"
        },
        ...
    ],
    "count": 10
}
```

### 4. DELETE Screenshot
**Endpoint:** `DELETE /api/screenshot?id=1`

**Response:**
```json
{
    "success": true,
    "message": "Screenshot deleted"
}
```

---

## 🖥️ Dashboard Usage

### View Screenshot
```
http://tracker.lppmunud.id/dashboard/index.php?page=agent-detail&id=117295468
```
Button "Screenshot" akan membuka live view.

### Direct Access
```
http://tracker.lppmunud.id/dashboard/views/screenshot.php?agent_id=117295468
```

---

## 💻 Agent Implementation (C#)

### 1. Capture Screenshot
```csharp
public class ScreenCaptureService
{
    public static Bitmap CaptureScreen()
    {
        var screenSize = SystemInformation.PrimaryMonitorSize;
        var bitmap = new Bitmap(screenSize.Width, screenSize.Height);
        
        using (var graphics = Graphics.FromImage(bitmap))
        {
            graphics.CopyFromScreen(0, 0, 0, 0, screenSize);
        }
        
        return bitmap;
    }
}
```

### 2. Encode & Send to API
```csharp
public void SendScreenshot()
{
    var screenshot = ScreenCaptureService.CaptureScreen();
    
    using (var ms = new MemoryStream())
    {
        screenshot.Save(ms, ImageFormat.Png);
        byte[] imageBytes = ms.ToArray();
        string base64String = Convert.ToBase64String(imageBytes);
        
        var data = new
        {
            agent_id = Config.AgentId,
            screenshot_base64 = base64String,
            captured_at = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")
        };
        
        SendToAPI("POST", "/api/screenshot", data);
    }
}
```

### 3. Schedule Capture (setiap 30 detik)
```csharp
private Timer _screenshotTimer;

public void StartScreenshotCapture()
{
    _screenshotTimer = new Timer(
        callback: (obj) => SendScreenshot(),
        state: null,
        dueTime: TimeSpan.Zero,
        period: TimeSpan.FromSeconds(30)  // 30 seconds
    );
}
```

---

## ⚙️ Configuration

### Agent Config (`config.json`)
```json
{
    "screenshot_interval": 30,  // Capture every 30 seconds
    "screenshot_enabled": true,
    "screenshot_quality": 85,   // JPEG quality (0-100)
    "screenshot_max_size_mb": 5 // Max file size
}
```

---

## 📊 Privacy & Security

### Storage
- Screenshots disimpan di `/screenshots/{agent_id}/` dengan format timestamp
- Tidak dienkripsi (opsional bisa tambah encryption)
- Auto-delete setelah X hari (recommend: 7 hari)

### Access Control
- Hanya user yang ter-autentikasi bisa akses
- Hanya admin/supervisor bisa view screenshots
- Log semua screenshot access di table `api_logs`

---

## 📝 Implementation Checklist

- [x] Database table `screenshots` created
- [x] API Controller `ScreenshotController.php` created
- [x] API endpoints implemented
- [x] Dashboard view created
- [ ] Agent C# code (pending - untuk step berikutnya)
- [ ] Auto-cleanup old screenshots (recommend add cronjob)
- [ ] Encryption at rest (optional enhancement)
- [ ] Rate limiting on screenshot endpoint

---

## 🔧 Integration dengan Dashboard

Tambah button "Screenshot" di halaman agent-detail:

```php
<?php
// di dashboard/views/agent-detail.php
$agent_id = $_GET['id'] ?? null;
?>

<a href="screenshot.php?agent_id=<?php echo htmlspecialchars($agent_id); ?>" 
   class="btn btn-primary">
   📺 Live Screen Mirror
</a>
```

---

## 📈 Performance Notes

- Screenshot size typical: 100-500 KB (depends on resolution)
- Network transfer: ~1-5 detik per 30-second interval
- Storage: ~2.5-10 MB per hari (per agent)
- Database queries: O(1) untuk latest, O(n) untuk history

---

## 🚀 Next Steps

1. Upload files ke webhost:
   - `api/controllers/ScreenshotController.php`
   - `dashboard/views/screenshot.php`
   - Update `api/index.php`

2. Implement Agent C# code (coming next)

3. Test end-to-end screenshot capture & display

---

**Status:** ✅ Backend Ready | ⏳ Agent Code Pending

