// Package server provides HTTP API endpoints for HAMView
//
// # API Documentation
//
// This package exposes REST API endpoints for querying amateur radio data.
// All endpoints return JSON responses and use standard HTTP status codes.
//
// # Base URL
//
// All API endpoints are prefixed with `/api/v1`
//
// # Response Format
//
// Success responses return the requested data with HTTP 200 OK status.
// Error responses return JSON with the following structure:
//
//	{
//	  "error": "error message description"
//	}
//
// # HTTP Status Codes
//
//   - 200 OK: Request successful
//   - 400 Bad Request: Invalid query parameters
//   - 404 Not Found: Resource not found
//   - 500 Internal Server Error: Server error
//
// # Data Types
//
// ## Radio
//
// Represents an amateur radio receiver/station.
//
// JSON Schema:
//
//	{
//	  "id": integer,                    // Unique identifier
//	  "name": string,                   // Station name (unique)
//	  "is_online": boolean,             // Current online status
//	  "manufacturer": string,           // Hardware manufacturer
//	  "device": string | null,          // Device model name
//	  "firmware_version": string | null, // Firmware version string
//	  "firmware_date": string | null,   // Firmware date (ISO 8601)
//	  "antenna": string | null,         // Antenna description
//	  "modulation": string,             // Modulation type (e.g., "LoRa")
//	  "protocol": string,               // Protocol name (e.g., "meshcore", "aprs")
//	  "latitude": number | null,        // Latitude in decimal degrees
//	  "longitude": number | null,       // Longitude in decimal degrees
//	  "altitude": number | null,        // Altitude in meters
//	  "frequency": number,              // Frequency in Hz
//	  "bandwidth": number,              // Bandwidth in Hz
//	  "power": number | null,           // Transmit power in dBm
//	  "gain": number | null,            // Antenna gain in dBi
//	  "lora_sf": integer | null,        // LoRa spreading factor (7-12)
//	  "lora_cr": integer | null,        // LoRa coding rate (5-8)
//	  "extra": object | null,           // Additional metadata
//	  "created_at": string,             // Creation timestamp (ISO 8601)
//	  "updated_at": string              // Last update timestamp (ISO 8601)
//	}
//
// Example:
//
//	{
//	  "id": 1,
//	  "name": "Station-Alpha",
//	  "is_online": true,
//	  "manufacturer": "Heltec",
//	  "device": "WiFi LoRa 32 V3",
//	  "firmware_version": "1.0.0",
//	  "firmware_date": "2026-01-15T00:00:00Z",
//	  "antenna": "868MHz 3dBi",
//	  "modulation": "LoRa",
//	  "protocol": "meshcore",
//	  "latitude": 52.3667,
//	  "longitude": 4.8945,
//	  "altitude": 5.0,
//	  "frequency": 868.1,
//	  "bandwidth": 125.0,
//	  "power": 14.0,
//	  "gain": 3.0,
//	  "lora_sf": 7,
//	  "lora_cr": 5,
//	  "extra": null,
//	  "created_at": "2026-01-01T12:00:00Z",
//	  "updated_at": "2026-03-05T10:30:00Z"
//	}
//
// ## MeshCorePacket
//
// Represents a received MeshCore protocol packet.
//
// JSON Schema:
//
//	{
//	  "id": integer,                    // Unique packet identifier
//	  "radio_id": integer,              // Radio that received this packet
//	  "radio": Radio | null,            // Radio object (when populated)
//	  "snr": number,                    // Signal-to-noise ratio in dB
//	  "rssi": integer,                  // Received signal strength in dBm
//	  "version": integer,               // Protocol version
//	  "route_type": integer,            // Routing type (0=broadcast, 1=unicast, etc.)
//	  "payload_type": integer,          // Payload type identifier
//	  "hash": string,                   // 16-character hex hash
//	  "path": string,                   // Base64-encoded routing path
//	  "payload": string,                // Base64-encoded payload data
//	  "raw": string,                    // Base64-encoded raw packet
//	  "parsed": object | null,          // Parsed payload (type depends on payload_type)
//	  "channel_hash": string,           // 2-character channel hash (for group messages)
//	  "received_at": string             // Reception timestamp (ISO 8601)
//	}
//
// Example:
//
//	{
//	  "id": 12345,
//	  "radio_id": 1,
//	  "radio": null,
//	  "snr": 8.5,
//	  "rssi": -95,
//	  "version": 1,
//	  "route_type": 0,
//	  "payload_type": 3,
//	  "hash": "a1b2c3d4e5f67890",
//	  "path": "AQIDBA==",
//	  "payload": "SGVsbG8gV29ybGQ=",
//	  "raw": "AQIDBAUGBwg=",
//	  "parsed": {"text": "Hello World"},
//	  "channel_hash": "ab",
//	  "received_at": "2026-03-05T14:30:00Z"
//	}
//
// ## MeshCoreNode
//
// Represents a MeshCore network node.
//
// JSON Schema:
//
//	{
//	  "id": integer,                    // Unique node identifier
//	  "packet": MeshCorePacket[],       // Associated packets
//	  "name": string,                   // Node name/callsign
//	  "type": integer,                  // Node type (0=repeater, 1=chat, 2=room, 3=sensor)
//	  "prefix": string,                 // 2-character network prefix
//	  "public_key": string,             // Hex-encoded Ed25519 public key (64 chars)
//	  "first_heard_at": string,         // First heard timestamp (ISO 8601)
//	  "last_heard_at": string,          // Last heard timestamp (ISO 8601)
//	  "last_latitude": number | null,   // Last known latitude
//	  "last_longitude": number | null,  // Last known longitude
//	  "distance": number                // Distance in meters (only in proximity queries)
//	}
//
// Example:
//
//	{
//	  "id": 42,
//	  "packet": [],
//	  "name": "NODE-CHARLIE",
//	  "type": 0,
//	  "prefix": "mc",
//	  "public_key": "1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef",
//	  "first_heard_at": "2026-01-15T08:00:00Z",
//	  "last_heard_at": "2026-03-05T14:25:00Z",
//	  "last_latitude": 52.3667,
//	  "last_longitude": 4.8945,
//	  "distance": 0
//	}
//
// ## MeshCoreGroup
//
// Represents a MeshCore group/channel.
//
// JSON Schema:
//
//	{
//	  "id": integer,                    // Unique group identifier
//	  "name": string,                   // Group name (max 32 chars)
//	  "secret": string                  // Group secret/key (32 chars)
//	}
//
// Example:
//
//	{
//	  "id": 5,
//	  "name": "General Chat",
//	  "secret": "0123456789abcdef0123456789abcdef"
//	}
//
// ## MeshCoreStats
//
// Aggregated statistics for the MeshCore network.
//
// JSON Schema:
//
//	{
//	  "messages": integer,              // Total message count
//	  "nodes": integer,                 // Total node count
//	  "receivers": integer,             // Total receiver count
//	  "packets": {
//	    "timestamps": integer[],        // Unix timestamps
//	    "packets": integer[]            // Packet counts per timestamp
//	  }
//	}
//
// Example:
//
//	{
//	  "messages": 150234,
//	  "nodes": 127,
//	  "receivers": 8,
//	  "packets": {
//	    "timestamps": [1709650800, 1709654400, 1709658000],
//	    "packets": [142, 203, 178]
//	  }
//	}
//
// ## NodesCloseToResponse
//
// Response for nodes proximity query.
//
// JSON Schema:
//
//	{
//	  "node": MeshCoreNode,             // The reference node
//	  "nodes": MeshCoreNode[]           // Nearby nodes (with distance field populated)
//	}
//
// Example:
//
//	{
//	  "node": {
//	    "id": 42,
//	    "name": "NODE-CHARLIE",
//	    "type": 0,
//	    "prefix": "mc",
//	    "public_key": "1234...abcdef",
//	    "first_heard_at": "2026-01-15T08:00:00Z",
//	    "last_heard_at": "2026-03-05T14:25:00Z",
//	    "last_latitude": 52.3667,
//	    "last_longitude": 4.8945,
//	    "distance": 0
//	  },
//	  "nodes": [
//	    {
//	      "id": 43,
//	      "name": "NODE-DELTA",
//	      "type": 0,
//	      "prefix": "mc",
//	      "public_key": "abcd...5678",
//	      "first_heard_at": "2026-02-01T10:00:00Z",
//	      "last_heard_at": "2026-03-05T14:20:00Z",
//	      "last_latitude": 52.3700,
//	      "last_longitude": 4.9000,
//	      "distance": 450.5
//	    }
//	  ]
//	}
//
// ## ErrorResponse
//
// Standard error response format.
//
// JSON Schema:
//
//	{
//	  "error": string                   // Human-readable error message
//	}
//
// Example:
//
//	{
//	  "error": "invalid hash"
//	}
package server
