import { useState } from 'react'; import { Database, Download, Upload, FileText, Key, Plus, Copy, Eye, EyeOff, Trash2, Check, X, AlertTriangle, Clock, HardDrive, Cpu, Activity, Package, ToggleLeft, ToggleRight, Calendar, Filter, } from 'lucide-react'; import { Button } from '@components/atoms/Button'; import { Input } from '@components/atoms/Input'; import { Card, CardHeader, CardTitle, CardContent, CardFooter } from '@components/molecules/Card'; import { DataTable, type Column } from '@components/organisms/DataTable'; import { Breadcrumbs } from '@components/organisms/Breadcrumbs'; import { ConfirmModal } from '@components/organisms/Modal'; import { formatDate } from '@utils/formatters'; interface BackupConfig { autoBackup: boolean; frequency: 'daily' | 'weekly' | 'monthly'; retentionDays: number; lastBackup: string | null; nextBackup: string | null; storageLocation: string; } interface SystemLog { id: string; timestamp: string; level: 'info' | 'warning' | 'error'; source: string; message: string; } interface ApiKey { id: string; name: string; key: string; createdAt: string; lastUsed: string | null; permissions: string[]; isActive: boolean; } interface Module { id: string; name: string; description: string; version: string; isActive: boolean; isCore: boolean; } const initialBackupConfig: BackupConfig = { autoBackup: true, frequency: 'daily', retentionDays: 30, lastBackup: new Date(Date.now() - 86400000).toISOString(), nextBackup: new Date(Date.now() + 43200000).toISOString(), storageLocation: 'cloud', }; const mockSystemLogs: SystemLog[] = [ { id: '1', timestamp: new Date().toISOString(), level: 'info', source: 'auth', message: 'Usuario juan.perez@miempresa.com inicio sesion exitosamente', }, { id: '2', timestamp: new Date(Date.now() - 300000).toISOString(), level: 'warning', source: 'database', message: 'Conexion a base de datos lenta (>500ms)', }, { id: '3', timestamp: new Date(Date.now() - 600000).toISOString(), level: 'info', source: 'backup', message: 'Respaldo automatico completado exitosamente', }, { id: '4', timestamp: new Date(Date.now() - 900000).toISOString(), level: 'error', source: 'email', message: 'Error al enviar notificacion: SMTP timeout', }, { id: '5', timestamp: new Date(Date.now() - 1200000).toISOString(), level: 'info', source: 'system', message: 'Modulo de inventario actualizado a v2.1.0', }, { id: '6', timestamp: new Date(Date.now() - 1500000).toISOString(), level: 'warning', source: 'storage', message: 'Uso de almacenamiento al 75%', }, { id: '7', timestamp: new Date(Date.now() - 1800000).toISOString(), level: 'info', source: 'auth', message: 'Token de API generado para integracion externa', }, { id: '8', timestamp: new Date(Date.now() - 2100000).toISOString(), level: 'error', source: 'api', message: 'Rate limit excedido para IP 192.168.1.100', }, { id: '9', timestamp: new Date(Date.now() - 2400000).toISOString(), level: 'info', source: 'database', message: 'Migracion de base de datos completada', }, { id: '10', timestamp: new Date(Date.now() - 2700000).toISOString(), level: 'info', source: 'system', message: 'Sistema iniciado correctamente', }, ]; const mockApiKeys: ApiKey[] = [ { id: '1', name: 'Integracion Shopify', key: 'sk_live_xxxxxxxxxxxxxxxxxxxxxxxxxxxxx', createdAt: new Date(Date.now() - 2592000000).toISOString(), lastUsed: new Date(Date.now() - 3600000).toISOString(), permissions: ['read:products', 'write:orders'], isActive: true, }, { id: '2', name: 'API Movil', key: 'sk_live_yyyyyyyyyyyyyyyyyyyyyyyyyyy', createdAt: new Date(Date.now() - 5184000000).toISOString(), lastUsed: new Date().toISOString(), permissions: ['read:all', 'write:all'], isActive: true, }, { id: '3', name: 'Webhook Pagos', key: 'sk_live_zzzzzzzzzzzzzzzzzzzzzzzzzzz', createdAt: new Date(Date.now() - 7776000000).toISOString(), lastUsed: null, permissions: ['write:payments'], isActive: false, }, ]; const mockModules: Module[] = [ { id: '1', name: 'Core', description: 'Funcionalidades basicas del sistema', version: '1.0.0', isActive: true, isCore: true, }, { id: '2', name: 'Inventario', description: 'Gestion de productos y stock', version: '2.1.0', isActive: true, isCore: false, }, { id: '3', name: 'Ventas', description: 'Punto de venta y facturacion', version: '1.5.0', isActive: true, isCore: false, }, { id: '4', name: 'Compras', description: 'Ordenes de compra y proveedores', version: '1.3.0', isActive: true, isCore: false, }, { id: '5', name: 'Contabilidad', description: 'Plan de cuentas y asientos contables', version: '1.2.0', isActive: false, isCore: false, }, { id: '6', name: 'CRM', description: 'Gestion de clientes y oportunidades', version: '1.0.0', isActive: false, isCore: false, }, { id: '7', name: 'Proyectos', description: 'Gestion de proyectos y tareas', version: '1.0.0', isActive: false, isCore: false, }, { id: '8', name: 'RRHH', description: 'Recursos humanos y nomina', version: '0.9.0', isActive: false, isCore: false, }, ]; export function SystemSettingsPage() { const [backupConfig, setBackupConfig] = useState(initialBackupConfig); const [systemLogs] = useState(mockSystemLogs); const [apiKeys, setApiKeys] = useState(mockApiKeys); const [modules, setModules] = useState(mockModules); const [isBackingUp, setIsBackingUp] = useState(false); const [isRestoring, setIsRestoring] = useState(false); const [showNewApiKeyModal, setShowNewApiKeyModal] = useState(false); const [newApiKeyName, setNewApiKeyName] = useState(''); const [generatedApiKey, setGeneratedApiKey] = useState(null); const [visibleKeys, setVisibleKeys] = useState>(new Set()); const [apiKeyToDelete, setApiKeyToDelete] = useState(null); const [logLevelFilter, setLogLevelFilter] = useState(''); const [logSourceFilter, setLogSourceFilter] = useState(''); const handleBackupNow = async () => { setIsBackingUp(true); await new Promise((resolve) => setTimeout(resolve, 3000)); setBackupConfig((prev) => ({ ...prev, lastBackup: new Date().toISOString(), })); setIsBackingUp(false); alert('Respaldo completado exitosamente'); }; const handleRestore = async () => { setIsRestoring(true); await new Promise((resolve) => setTimeout(resolve, 2000)); setIsRestoring(false); alert('Por favor selecciona un archivo de respaldo para restaurar'); }; const handleBackupConfigChange = (field: keyof BackupConfig, value: unknown) => { setBackupConfig((prev) => ({ ...prev, [field]: value })); }; const handleCreateApiKey = async () => { if (!newApiKeyName.trim()) { alert('Ingresa un nombre para la API key'); return; } const newKey = `sk_live_${Math.random().toString(36).substring(2, 32)}`; const newApiKey: ApiKey = { id: String(apiKeys.length + 1), name: newApiKeyName, key: newKey, createdAt: new Date().toISOString(), lastUsed: null, permissions: ['read:all'], isActive: true, }; setApiKeys((prev) => [...prev, newApiKey]); setGeneratedApiKey(newKey); }; const handleCloseNewApiKeyModal = () => { setShowNewApiKeyModal(false); setNewApiKeyName(''); setGeneratedApiKey(null); }; const handleCopyApiKey = (key: string) => { navigator.clipboard.writeText(key); alert('API key copiada al portapapeles'); }; const toggleKeyVisibility = (keyId: string) => { setVisibleKeys((prev) => { const newSet = new Set(prev); if (newSet.has(keyId)) { newSet.delete(keyId); } else { newSet.add(keyId); } return newSet; }); }; const handleDeleteApiKey = async () => { if (apiKeyToDelete) { setApiKeys((prev) => prev.filter((k) => k.id !== apiKeyToDelete.id)); setApiKeyToDelete(null); alert(`API key "${apiKeyToDelete.name}" eliminada`); } }; const handleToggleModule = (moduleId: string) => { setModules((prev) => prev.map((m) => m.id === moduleId && !m.isCore ? { ...m, isActive: !m.isActive } : m ) ); }; const getLevelIcon = (level: SystemLog['level']) => { switch (level) { case 'info': return ; case 'warning': return ; case 'error': return ; } }; const getLevelColor = (level: SystemLog['level']) => { switch (level) { case 'info': return 'bg-blue-100 text-blue-700'; case 'warning': return 'bg-yellow-100 text-yellow-700'; case 'error': return 'bg-red-100 text-red-700'; } }; const filteredLogs = systemLogs.filter((log) => { if (logLevelFilter && log.level !== logLevelFilter) return false; if (logSourceFilter && log.source !== logSourceFilter) return false; return true; }); const uniqueSources = [...new Set(systemLogs.map((l) => l.source))]; const logColumns: Column[] = [ { key: 'timestamp', header: 'Fecha', render: (log) => ( {formatDate(log.timestamp, 'full')} ), }, { key: 'level', header: 'Nivel', render: (log) => ( {getLevelIcon(log.level)} {log.level.toUpperCase()} ), }, { key: 'source', header: 'Fuente', render: (log) => ( {log.source} ), }, { key: 'message', header: 'Mensaje', render: (log) => {log.message}, }, ]; const apiKeyColumns: Column[] = [ { key: 'name', header: 'Nombre', render: (apiKey) => (
{apiKey.name}
Creada: {formatDate(apiKey.createdAt, 'short')}
), }, { key: 'key', header: 'API Key', render: (apiKey) => (
{visibleKeys.has(apiKey.id) ? apiKey.key : `${apiKey.key.slice(0, 10)}${'*'.repeat(20)}`}
), }, { key: 'lastUsed', header: 'Ultimo uso', render: (apiKey) => ( {apiKey.lastUsed ? formatDate(apiKey.lastUsed, 'short') : 'Nunca'} ), }, { key: 'isActive', header: 'Estado', render: (apiKey) => ( {apiKey.isActive ? ( <> Activa ) : ( <> Inactiva )} ), }, { key: 'actions', header: '', render: (apiKey) => ( ), }, ]; return (

Configuracion del Sistema

Administra respaldos, logs, API keys y modulos

{/* System Stats */}
Base de datos
2.3 GB
Almacenamiento
75%
CPU
23%
Uptime
99.9%
{/* Backup Configuration */} Respaldos
Respaldo automatico
Realiza respaldos automaticos de la base de datos
{backupConfig.autoBackup && ( <>
handleBackupConfigChange('retentionDays', parseInt(e.target.value)) } min={7} max={365} />
)}
Ultimo respaldo
{backupConfig.lastBackup ? formatDate(backupConfig.lastBackup, 'full') : 'Nunca'}
{backupConfig.autoBackup && backupConfig.nextBackup && (
Proximo respaldo
{formatDate(backupConfig.nextBackup, 'full')}
)}
{/* System Logs */}
Logs del Sistema
{/* Filters */}
{(logLevelFilter || logSourceFilter) && ( )}
{/* API Keys */}
API Keys

Gestiona las API keys para integraciones externas

{/* Active Modules */} Modulos Activos
{modules.map((module) => (
{module.name} {module.isCore && ( Core )}
v{module.version}
{module.description}
{!module.isCore && ( )}
))}
{/* New API Key Modal */} {showNewApiKeyModal && (
{generatedApiKey ? 'API Key Generada' : 'Nueva API Key'} {!generatedApiKey ? (
setNewApiKeyName(e.target.value)} placeholder="Ej: Integracion Shopify" />

Un nombre descriptivo para identificar esta API key

) : (

Guarda esta API key de forma segura

Esta es la unica vez que veras esta API key completa. No podras verla de nuevo.

{generatedApiKey}
)}
{!generatedApiKey && ( )}
)} {/* Delete API Key Modal */} setApiKeyToDelete(null)} onConfirm={handleDeleteApiKey} title="Eliminar API Key" message={`¿Eliminar la API key "${apiKeyToDelete?.name}"? Las integraciones que usen esta key dejaran de funcionar.`} variant="danger" confirmText="Eliminar" />
); } export default SystemSettingsPage;