import 'package:flutter/material.dart'; import '../services/database_service.dart'; import '../theme/app_theme.dart'; class SystemStatusDialog extends StatelessWidget { final SystemStatusResult status; const SystemStatusDialog({ super.key, required this.status, }); String _formatTime(DateTime date) { final h = date.hour.toString().padLeft(2, '0'); final m = date.minute.toString().padLeft(2, '0'); final s = date.second.toString().padLeft(2, '0'); return '$h:$m:$s Uhr'; } @override Widget build(BuildContext context) { final isConnected = status.isConnected; return Dialog( shape: RoundedRectangleBorder( borderRadius: BorderRadius.circular(20), ), child: ConstrainedBox( constraints: BoxConstraints( maxHeight: MediaQuery.of(context).size.height * 0.8, ), child: Padding( padding: const EdgeInsets.all(20), child: Column( mainAxisSize: MainAxisSize.min, crossAxisAlignment: CrossAxisAlignment.start, children: [ // Title Header with Icon Row( children: [ Container( padding: const EdgeInsets.all(10), decoration: BoxDecoration( color: isConnected ? const Color(0xFFDCFCE7) : const Color(0xFFFEE2E2), shape: BoxShape.circle, ), child: Icon( Icons.bolt, color: isConnected ? const Color(0xFF166534) : const Color(0xFF991B1B), size: 24, ), ), const SizedBox(width: 12), const Expanded( child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ Text( 'Systemstatus Details', style: TextStyle( fontSize: 18, fontWeight: FontWeight.bold, color: AppTheme.textPrimary, ), ), Text( 'Datenbank & API Verbindung', style: TextStyle( fontSize: 12, color: AppTheme.textSecondary, ), ), ], ), ), IconButton( icon: const Icon(Icons.close, color: AppTheme.textSecondary), onPressed: () => Navigator.of(context).pop(), ), ], ), const SizedBox(height: 12), const Divider(height: 1, color: AppTheme.cardBorder), const SizedBox(height: 12), // Scrollable Details Body Flexible( child: SingleChildScrollView( child: Column( crossAxisAlignment: CrossAxisAlignment.start, mainAxisSize: MainAxisSize.min, children: [ // Connection Badge Status Box Container( padding: const EdgeInsets.all(12), decoration: BoxDecoration( color: isConnected ? const Color(0xFFF0FDF4) : const Color(0xFFFEF2F2), borderRadius: BorderRadius.circular(12), border: Border.all( color: isConnected ? const Color(0xFFBBF7D0) : const Color(0xFFFECACA), ), ), child: Row( children: [ Container( width: 10, height: 10, decoration: BoxDecoration( color: isConnected ? const Color(0xFF22C55E) : const Color(0xFFEF4444), shape: BoxShape.circle, ), ), const SizedBox(width: 10), Expanded( child: Text( isConnected ? 'Verbunden: Supabase (Self-Hosted)' : 'Offline / Verbindung fehlgeschlagen', style: TextStyle( fontSize: 14, fontWeight: FontWeight.bold, color: isConnected ? const Color(0xFF15803D) : const Color(0xFFB91C1C), ), ), ), ], ), ), const SizedBox(height: 16), // Technical Details List _buildDetailRow('Host Server', status.host), _buildDetailRow('Datenbank Name', status.dbName), _buildDetailRow( 'Latenz (Ping)', '${status.latencyMs} ms', valueColor: status.latencyMs < 100 ? Colors.green[700] : Colors.orange[800], ), _buildDetailRow( 'Sicherheit / SSL', status.isSslEnabled ? 'TLS / HTTPS (Aktiv)' : 'Insecure / HTTP', ), _buildDetailRow( 'Letzte Synchronisation', _formatTime(status.lastSync), ), // Error Box (Scrollable max height) if (status.errorMessage != null) ...[ const SizedBox(height: 14), Container( width: double.infinity, padding: const EdgeInsets.all(12), decoration: BoxDecoration( color: const Color(0xFFFEF2F2), borderRadius: BorderRadius.circular(10), border: Border.all(color: const Color(0xFFFECACA)), ), child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ const Row( children: [ Icon(Icons.warning_amber_rounded, size: 16, color: Color(0xFF991B1B)), SizedBox(width: 6), Text( 'Fehlermeldung:', style: TextStyle( fontSize: 12, fontWeight: FontWeight.bold, color: Color(0xFF991B1B), ), ), ], ), const SizedBox(height: 6), ConstrainedBox( constraints: const BoxConstraints(maxHeight: 160), child: SingleChildScrollView( child: SelectableText( status.errorMessage!, style: const TextStyle( fontSize: 11, color: Color(0xFFB91C1C), fontFamily: 'monospace', ), ), ), ), ], ), ), ], ], ), ), ), const SizedBox(height: 16), // Close Action Button SizedBox( width: double.infinity, child: ElevatedButton( onPressed: () => Navigator.of(context).pop(), style: ElevatedButton.styleFrom( backgroundColor: AppTheme.primaryDark, foregroundColor: Colors.white, padding: const EdgeInsets.symmetric(vertical: 12), shape: RoundedRectangleBorder( borderRadius: BorderRadius.circular(10), ), ), child: const Text('Schließen'), ), ), ], ), ), ), ); } Widget _buildDetailRow(String label, String value, {Color? valueColor}) { return Padding( padding: const EdgeInsets.symmetric(vertical: 6), child: Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ Text( label, style: const TextStyle( fontSize: 13, color: AppTheme.textSecondary, ), ), const SizedBox(width: 12), Expanded( child: Text( value, textAlign: TextAlign.end, style: TextStyle( fontSize: 13, fontWeight: FontWeight.bold, color: valueColor ?? AppTheme.textPrimary, ), ), ), ], ), ); } }