# Admin Notification System

## Overview

The admin notification system provides real-time alerts and notifications to platform administrators for important events, errors, and system status updates.

## Components

### Backend

#### Database Models

Located in `models/database/admin.py`:

- **AdminNotification**: Stores individual notifications
  - `type`: Notification type (import_failure, order_sync_failure, etc.)
  - `priority`: low, normal, high, critical
  - `title`, `message`: Content
  - `is_read`, `read_at`, `read_by_user_id`: Read tracking
  - `action_required`, `action_url`: Optional action link
  - `notification_metadata`: JSON for additional context

- **PlatformAlert**: Stores platform-wide alerts
  - `alert_type`: security, performance, capacity, integration, etc.
  - `severity`: info, warning, error, critical
  - `affected_stores`, `affected_systems`: Scope tracking
  - `occurrence_count`, `first_occurred_at`, `last_occurred_at`: Deduplication
  - `is_resolved`, `resolved_at`, `resolution_notes`: Resolution tracking

#### Service Layer

Located in `app/services/admin_notification_service.py`:

```python
from app.services.admin_notification_service import (
    admin_notification_service,
    platform_alert_service,
    NotificationType,
    Priority,
    AlertType,
    Severity,
)
```

**AdminNotificationService** methods:

| Method | Description |
|--------|-------------|
| `create_notification()` | Create a new notification |
| `get_notifications()` | List notifications with filters |
| `get_recent_notifications()` | Get recent unread for header dropdown |
| `get_unread_count()` | Count unread notifications |
| `mark_as_read()` | Mark single notification read |
| `mark_all_as_read()` | Mark all as read |
| `delete_notification()` | Delete a notification |

**Convenience methods** for common scenarios:

| Method | Use Case |
|--------|----------|
| `notify_import_failure()` | Product/order import failed |
| `notify_order_sync_failure()` | Letzshop sync failed |
| `notify_order_exception()` | Order has unmatched products |
| `notify_critical_error()` | System critical error |
| `notify_store_issue()` | Store-related problem |
| `notify_security_alert()` | Security event detected |

**PlatformAlertService** methods:

| Method | Description |
|--------|-------------|
| `create_alert()` | Create a new platform alert |
| `get_alerts()` | List alerts with filters |
| `resolve_alert()` | Mark alert as resolved |
| `get_statistics()` | Get alert counts and stats |
| `create_or_increment_alert()` | Deduplicate recurring alerts |

#### API Endpoints

Located in `app/api/v1/admin/notifications.py`:

**Notifications:**
- `GET /api/v1/admin/notifications` - List with filters
- `POST /api/v1/admin/notifications` - Create (manual)
- `GET /api/v1/admin/notifications/recent` - For header dropdown
- `GET /api/v1/admin/notifications/unread-count` - Badge count
- `PUT /api/v1/admin/notifications/{id}/read` - Mark read
- `PUT /api/v1/admin/notifications/mark-all-read` - Mark all read
- `DELETE /api/v1/admin/notifications/{id}` - Delete

**Platform Alerts:**
- `GET /api/v1/admin/notifications/alerts` - List with filters
- `POST /api/v1/admin/notifications/alerts` - Create (manual)
- `PUT /api/v1/admin/notifications/alerts/{id}/resolve` - Resolve
- `GET /api/v1/admin/notifications/alerts/stats` - Statistics

### Frontend

#### Header Dropdown

Located in `app/templates/admin/partials/header.html`:

- Real-time notification bell with unread count badge
- Polls for new notifications every 60 seconds
- Quick actions: mark as read, view all
- Priority-based color coding

#### Notifications Page

Located in `app/templates/admin/notifications.html` with `static/admin/js/notifications.js`:

- Full notifications management interface
- Two tabs: Notifications and Platform Alerts
- Statistics cards (unread, active alerts, critical, resolved today)
- Filtering by priority, type, read status
- Bulk operations (mark all read)
- Alert resolution workflow

## Automatic Triggers

Notifications are automatically created in these scenarios:

### Import Failures

**Product Import** (`app/tasks/background_tasks.py`):
- When a product import job fails completely
- When import completes with 5+ errors

**Historical Order Import** (`app/tasks/letzshop_tasks.py`):
- When Letzshop API returns an error
- When import fails with an unexpected exception

### Example Usage

```python
from app.services.admin_notification_service import admin_notification_service

# In a background task or service
admin_notification_service.notify_import_failure(
    db=db,
    store_name="Acme Corp",
    job_id=123,
    error_message="CSV parsing failed: invalid column format",
    store_id=5,
)
db.commit()
```

## Priority Levels

| Priority | When to Use | Badge Color |
|----------|-------------|-------------|
| `critical` | System down, data loss risk | Red |
| `high` | Import/sync failures, action needed | Orange |
| `normal` | Informational alerts | Blue |
| `low` | Minor issues, suggestions | Gray |

## Architecture

```
┌─────────────────┐     ┌──────────────────────┐
│  Background     │────▶│  Notification        │
│  Tasks          │     │  Service             │
└─────────────────┘     └──────────┬───────────┘
                                   │
┌─────────────────┐                ▼
│  API Endpoints  │◀───────────────┤
└─────────────────┘                │
                                   ▼
┌─────────────────┐     ┌──────────────────────┐
│  Header         │◀────│  Database            │
│  Dropdown       │     │  (admin_notifications│
└─────────────────┘     │   platform_alerts)   │
         │              └──────────────────────┘
         ▼
┌─────────────────┐
│  Notifications  │
│  Page           │
└─────────────────┘
```

## Future Enhancements

- Email notifications for critical alerts
- Webhook integration for external systems
- Customizable notification preferences per admin
- Scheduled notification digests
