# Projects System Implementation - Terra-View

## Overview

The Projects system has been successfully scaffolded in Terra-View. This document provides a complete overview of what has been built, how it works, and what needs to be completed.

## ✅ Completed Components

### 1. Database Schema

**Location**: `/backend/models.py`

Seven new tables have been added:

- **ProjectType**: Template definitions for project types (Sound, Vibration, Combined)
- **Project**: Top-level project organization with type reference
- **MonitoringLocation**: Generic locations (NRLs for sound, monitoring points for vibration)
- **UnitAssignment**: Links devices to locations
- **ScheduledAction**: Automated recording control schedules
- **RecordingSession**: Tracks actual recording/monitoring sessions
- **DataFile**: File references for downloaded data

**Key Features**:
- Type-aware design (project_type_id determines features)
- Flexible metadata fields (JSON columns for type-specific data)
- Denormalized fields for efficient queries
- Proper indexing on foreign keys

### 2. Service Layer

#### SLMM Client (`/backend/services/slmm_client.py`)
- Clean wrapper for all SLMM API operations
- Methods for: start/stop/pause/resume recording, get status, configure devices
- Error handling with custom exceptions
- Singleton pattern for easy access

#### Device Controller (`/backend/services/device_controller.py`)
- Routes commands to appropriate backend (SLMM for SLMs, SFM for seismographs)
- Unified interface across device types
- Ready for future SFM implementation

#### Scheduler Service (`/backend/services/scheduler.py`)
- Background task that checks for pending scheduled actions every 60 seconds
- Executes actions by calling device controller
- Creates/updates recording sessions
- Tracks execution status and errors
- Manual execution support for testing

### 3. API Routers

#### Projects Router (`/backend/routers/projects.py`)
Endpoints:
- `GET /api/projects/list` - Project list with stats
- `GET /api/projects/stats` - Overview statistics
- `POST /api/projects/create` - Create new project
- `GET /api/projects/{id}` - Get project details
- `PUT /api/projects/{id}` - Update project
- `DELETE /api/projects/{id}` - Archive project
- `GET /api/projects/{id}/dashboard` - Project dashboard data
- `GET /api/projects/types/list` - Get project type templates

#### Project Locations Router (`/backend/routers/project_locations.py`)
Endpoints:
- `GET /api/projects/{id}/locations` - List locations
- `POST /api/projects/{id}/locations/create` - Create location
- `PUT /api/projects/{id}/locations/{location_id}` - Update location
- `DELETE /api/projects/{id}/locations/{location_id}` - Delete location
- `GET /api/projects/{id}/assignments` - List unit assignments
- `POST /api/projects/{id}/locations/{location_id}/assign` - Assign unit
- `POST /api/projects/{id}/assignments/{assignment_id}/unassign` - Unassign unit
- `GET /api/projects/{id}/available-units` - Get units available for assignment

#### Scheduler Router (`/backend/routers/scheduler.py`)
Endpoints:
- `GET /api/projects/{id}/scheduler/actions` - List scheduled actions
- `POST /api/projects/{id}/scheduler/actions/create` - Create action
- `POST /api/projects/{id}/scheduler/schedule-session` - Schedule recording session
- `PUT /api/projects/{id}/scheduler/actions/{action_id}` - Update action
- `POST /api/projects/{id}/scheduler/actions/{action_id}/cancel` - Cancel action
- `DELETE /api/projects/{id}/scheduler/actions/{action_id}` - Delete action
- `POST /api/projects/{id}/scheduler/actions/{action_id}/execute` - Manual execution
- `GET /api/projects/{id}/scheduler/status` - Scheduler status
- `POST /api/projects/{id}/scheduler/execute-pending` - Trigger pending executions

### 4. Frontend

#### Main Page
**Location**: `/templates/projects/overview.html`

Features:
- Summary statistics cards (projects, locations, assignments, sessions)
- Tabbed interface (All, Active, Completed, Archived)
- Project cards grid layout
- Create project modal with two-step flow:
  1. Select project type (Sound/Vibration/Combined)
  2. Fill project details
- HTMX-powered dynamic updates

#### Navigation
**Location**: `/templates/base.html` (updated)
- "Projects" link added to sidebar
- Active state highlighting

### 5. Application Integration

**Location**: `/backend/main.py`

- Routers registered
- Page route added (`/projects`)
- Scheduler service starts on application startup
- Scheduler stops on application shutdown

### 6. Database Initialization

**Script**: `/backend/init_projects_db.py`

- Creates all project tables
- Populates ProjectType with default templates
- ✅ Successfully executed - database is ready

---

## 📁 File Organization

```
terra-view/
├── backend/
│   ├── models.py                              [✅ Updated]
│   ├── init_projects_db.py                    [✅ Created]
│   ├── main.py                                [✅ Updated]
│   ├── routers/
│   │   ├── projects.py                        [✅ Created]
│   │   ├── project_locations.py               [✅ Created]
│   │   └── scheduler.py                       [✅ Created]
│   └── services/
│       ├── slmm_client.py                     [✅ Created]
│       ├── device_controller.py               [✅ Created]
│       └── scheduler.py                       [✅ Created]
├── templates/
│   ├── base.html                              [✅ Updated]
│   ├── projects/
│   │   └── overview.html                      [✅ Created]
│   └── partials/
│       └── projects/                          [📁 Created, empty]
└── data/
    └── seismo_fleet.db                        [✅ Tables created]
```

---

## 🔨 What Still Needs to be Built

### 1. Frontend Templates (Partials)

**Directory**: `/templates/partials/projects/`

**Required Files**:

#### `project_stats.html`
Stats cards for overview page:
- Total/Active/Completed projects
- Total locations
- Assigned units
- Active sessions

#### `project_list.html`
Project cards grid:
- Project name, type, status
- Location count, unit count
- Active session indicator
- Link to project dashboard

#### `project_dashboard.html`
Main project dashboard panel with tabs:
- Summary stats
- Active locations and assignments
- Upcoming scheduled actions
- Recent sessions

#### `location_list.html`
Location cards/table:
- Location name, type, coordinates
- Assigned unit (if any)
- Session count
- Assign/unassign button

#### `assignment_list.html`
Unit assignment table:
- Unit ID, device type
- Location name
- Assignment dates
- Status
- Unassign button

#### `scheduler_agenda.html`
Calendar/agenda view:
- Scheduled actions sorted by time
- Action type (start/stop/download)
- Location and unit
- Status indicator
- Cancel/execute buttons

### 2. Project Dashboard Page

**Location**: `/templates/projects/project_dashboard.html`

Full project detail page with:
- Header with project name, type, status
- Tab navigation (Dashboard, Scheduler, Locations, Units, Data, Settings)
- Tab content areas
- Modals for adding locations, scheduling sessions

### 3. Additional UI Components

- Project type selection cards (with icons)
- Location creation modal
- Unit assignment modal
- Schedule session modal (with date/time picker)
- Data file browser

### 4. SLMM Enhancements

**Location**: `/slmm/app/routers.py` (SLMM repo)

New endpoint needed:
```python
POST /api/nl43/{unit_id}/ftp/download
```

This should:
- Accept destination_path and files list
- Connect to SLM via FTP
- Download specified files
- Save to Terra-View's `data/Projects/` directory
- Return file list with metadata

### 5. SFM Client (Future)

**Location**: `/backend/services/sfm_client.py` (to be created)

Similar to SLMM client, but for seismographs:
- Get seismograph status
- Start/stop recording
- Download data files
- Integrate with device controller

---

## 🚀 Testing the System

### 1. Start Terra-View

```bash
cd /home/serversdown/tmi/terra-view
# Start Terra-View (however you normally start it)
```

Verify in logs:
```
Starting scheduler service...
Scheduler service started
```

### 2. Navigate to Projects

Open browser: `http://localhost:8001/projects`

You should see:
- Summary stats cards (all zeros initially)
- Tabs (All Projects, Active, Completed, Archived)
- "New Project" button

### 3. Create a Project

1. Click "New Project"
2. Select a project type (e.g., "Sound Monitoring")
3. Fill in details:
   - Name: "Test Sound Project"
   - Client: "Test Client"
   - Start Date: Today
4. Submit

### 4. Test API Endpoints

```bash
# Get project types
curl http://localhost:8001/api/projects/types/list

# Get projects list
curl http://localhost:8001/api/projects/list

# Get project stats
curl http://localhost:8001/api/projects/stats
```

### 5. Test Scheduler Status

```bash
curl http://localhost:8001/api/projects/{project_id}/scheduler/status
```

---

## 📋 Dataflow Examples

### Creating and Scheduling a Recording Session

1. **User creates project** → Project record in DB
2. **User adds NRL** → MonitoringLocation record
3. **User assigns SLM to NRL** → UnitAssignment record
4. **User schedules recording** → 2 ScheduledAction records (start + stop)
5. **Scheduler runs every minute** → Checks for pending actions
6. **Start action time arrives** → Scheduler calls SLMM via device controller
7. **SLMM sends TCP command to SLM** → Recording starts
8. **RecordingSession created** → Tracks the session
9. **Stop action time arrives** → Scheduler stops recording
10. **Session updated** → stopped_at, duration_seconds filled
11. **User triggers download** → Files copied to `data/Projects/{project_id}/sound/{nrl_name}/`
12. **DataFile records created** → Track file references

---

## 🎨 UI Design Patterns

### Established Patterns (from SLM dashboard):

1. **Stats Cards**: 4-column grid, auto-refresh every 30s
2. **Sidebar Lists**: Searchable, filterable, auto-refresh
3. **Main Panel**: Large central area for details
4. **Modals**: Centered, overlay background
5. **HTMX**: All dynamic updates, minimal JavaScript
6. **Tailwind**: Consistent styling with dark mode support

### Color Scheme:

- Primary: `seismo-orange` (#f48b1c)
- Secondary: `seismo-navy` (#142a66)
- Accent: `seismo-burgundy` (#7d234d)

---

## 🔧 Configuration

### Environment Variables

- `SLMM_BASE_URL`: SLMM backend URL (default: http://localhost:8100)
- `ENVIRONMENT`: "development" or "production"

### Scheduler Settings

Located in `/backend/services/scheduler.py`:
- `check_interval`: 60 seconds (adjust as needed)

---

## 📚 Next Steps

### Immediate (Get Basic UI Working):
1. Create partial templates (stats, lists)
2. Test creating projects via UI
3. Implement project dashboard page

### Short-term (Core Features):
4. Add location management UI
5. Add unit assignment UI
6. Add scheduler UI (agenda view)

### Medium-term (Data Flow):
7. Implement SLMM download endpoint
8. Test full recording workflow
9. Add file browser for downloaded data

### Long-term (Complete System):
10. Implement SFM client for seismographs
11. Add data visualization
12. Add project reporting
13. Add user authentication

---

## 🐛 Known Issues / TODOs

1. **Partial templates missing**: Need to create HTML templates for all partials
2. **SLMM download endpoint**: Needs implementation in SLMM backend
3. **Project dashboard page**: Not yet created
4. **SFM integration**: Placeholder only, needs real implementation
5. **File download tracking**: DataFile records not yet created after downloads
6. **Error handling**: Need better user-facing error messages
7. **Validation**: Form validation could be improved
8. **Testing**: No automated tests yet

---

## 📖 API Documentation

### Project Type Object
```json
{
  "id": "sound_monitoring",
  "name": "Sound Monitoring",
  "description": "...",
  "icon": "volume-2",
  "supports_sound": true,
  "supports_vibration": false
}
```

### Project Object
```json
{
  "id": "uuid",
  "name": "Project Name",
  "description": "...",
  "project_type_id": "sound_monitoring",
  "status": "active",
  "client_name": "Client Inc",
  "site_address": "123 Main St",
  "site_coordinates": "40.7128,-74.0060",
  "start_date": "2024-01-15",
  "end_date": null,
  "created_at": "2024-01-15T10:00:00",
  "updated_at": "2024-01-15T10:00:00"
}
```

### MonitoringLocation Object
```json
{
  "id": "uuid",
  "project_id": "uuid",
  "location_type": "sound",
  "name": "NRL-001",
  "description": "...",
  "coordinates": "40.7128,-74.0060",
  "address": "123 Main St",
  "location_metadata": "{...}",
  "created_at": "2024-01-15T10:00:00"
}
```

### UnitAssignment Object
```json
{
  "id": "uuid",
  "unit_id": "nl43-001",
  "location_id": "uuid",
  "project_id": "uuid",
  "device_type": "sound_level_meter",
  "assigned_at": "2024-01-15T10:00:00",
  "assigned_until": null,
  "status": "active",
  "notes": "..."
}
```

### ScheduledAction Object
```json
{
  "id": "uuid",
  "project_id": "uuid",
  "location_id": "uuid",
  "unit_id": "nl43-001",
  "action_type": "start",
  "device_type": "sound_level_meter",
  "scheduled_time": "2024-01-16T08:00:00",
  "executed_at": null,
  "execution_status": "pending",
  "module_response": null,
  "error_message": null
}
```

---

## 🎓 Architecture Decisions

### Why Project Types?
Allows the system to scale to different monitoring scenarios (air quality, multi-hazard, etc.) without code changes. Just add a new ProjectType record and the UI adapts.

### Why Generic MonitoringLocation?
Instead of separate NRL and MonitoringPoint tables, one table with a `location_type` discriminator keeps the schema clean and allows for combined projects.

### Why Denormalized Fields?
Fields like `project_id` in UnitAssignment (already have via location) enable faster queries without joins.

### Why Scheduler in Terra-View?
Terra-View is the orchestration layer. SLMM only handles device communication. Keeping scheduling logic in Terra-View allows for complex workflows across multiple device types.

### Why JSON Metadata Columns?
Type-specific fields (like ambient_conditions for sound projects) don't apply to all location types. JSON columns provide flexibility without cluttering the schema.

---

## 💡 Tips for Continuing Development

1. **Follow Existing Patterns**: Look at the SLM dashboard code for reference
2. **Use HTMX Aggressively**: Minimize JavaScript, let HTMX handle updates
3. **Keep Routers Thin**: Move business logic to service layer
4. **Return HTML Partials**: Most endpoints should return HTML, not JSON
5. **Test Incrementally**: Build one partial at a time and test in browser
6. **Check Logs**: Scheduler logs execution attempts
7. **Use Browser DevTools**: Network tab shows HTMX requests

---

## 📞 Support

For questions or issues:
1. Check this document first
2. Review existing dashboards (SLM, Seismographs) for patterns
3. Check logs for scheduler execution details
4. Test API endpoints with curl to isolate issues

---

## ✅ Checklist for Completion

- [x] Database schema designed
- [x] Models created
- [x] Migration script run successfully
- [x] Service layer complete (SLMM client, device controller, scheduler)
- [x] API routers created (projects, locations, scheduler)
- [x] Navigation updated
- [x] Main overview page created
- [x] Routes registered in main.py
- [x] Scheduler service integrated
- [ ] Partial templates created
- [ ] Project dashboard page created
- [ ] Location management UI
- [ ] Unit assignment UI
- [ ] Scheduler UI (agenda view)
- [ ] SLMM download endpoint implemented
- [ ] Full workflow tested end-to-end
- [ ] SFM client implemented (future)

---

**Last Updated**: 2026-01-12

**Database Status**: ✅ Initialized

**Backend Status**: ✅ Complete

**Frontend Status**: 🟡 Partial (overview page only)

**Ready for Testing**: ✅ Yes (basic functionality)
