import React, { useState, useRef } from 'react'; import { Download, Upload, AlertTriangle, CheckCircle, Database, FileJson, Info, RefreshCw } from 'lucide-react'; import api from '../../services/api'; import { useOrganization } from '@clerk/clerk-react'; interface BackupStats { projects: number; inspections: number; applicationRecords: number; technicalDataSheets: number; paintingSchemes: number; parts: number; instruments: number; yieldStudies: number; geometryTypes: number; stockItems: number; stockMovements: number; } interface BackupValidation { valid: boolean; isValidOrganization: boolean; version: string; timestamp: string; organizationId: string; stats: BackupStats; message: string; } export const BackupRestore: React.FC = () => { const { organization } = useOrganization(); const [isExporting, setIsExporting] = useState(false); const [isImporting, setIsImporting] = useState(false); const [validationResult, setValidationResult] = useState(null); const [selectedFile, setSelectedFile] = useState(null); const fileInputRef = useRef(null); const handleExport = async () => { if (!organization) return; setIsExporting(true); try { const response = await api.get('/backup/export', { responseType: 'blob' }); // Cria um link de download const blob = new Blob([response.data], { type: 'application/json' }); const url = window.URL.createObjectURL(blob); const link = document.createElement('a'); link.href = url; // Nome do arquivo com timestamp const timestamp = new Date().toISOString().replace(/[:.]/g, '-').slice(0, -5); link.download = `backup_${organization.name}_${timestamp}.json`; document.body.appendChild(link); link.click(); document.body.removeChild(link); window.URL.revokeObjectURL(url); alert('✅ Backup exportado com sucesso!'); } catch (error) { console.error('Erro ao exportar backup:', error); alert('❌ Erro ao exportar backup. Verifique o console para mais detalhes.'); } finally { setIsExporting(false); } }; const handleFileSelect = async (e: React.ChangeEvent) => { const file = e.target.files?.[0]; if (!file) return; setSelectedFile(file); setValidationResult(null); // Valida o arquivo try { const fileContent = await file.text(); const backupData = JSON.parse(fileContent); const response = await api.post('/backup/validate', backupData); setValidationResult(response.data); } catch (error) { console.error('Erro ao validar backup:', error); alert('❌ Arquivo de backup inválido ou corrompido.'); setSelectedFile(null); } }; const handleImport = async () => { if (!selectedFile || !validationResult?.valid) return; const confirmed = window.confirm( '⚠️ ATENÇÃO: Esta ação irá SUBSTITUIR TODOS os dados atuais pelos dados do backup.\n\n' + 'Todos os projetos, inspeções, fichas técnicas e demais informações atuais serão PERMANENTEMENTE EXCLUÍDOS.\n\n' + 'Tem certeza que deseja continuar?' ); if (!confirmed) return; const doubleConfirm = window.confirm( '🔴 ÚLTIMA CONFIRMAÇÃO\n\n' + 'Esta é sua última chance de cancelar. Os dados atuais serão IRRECUPERÁVEIS após esta ação.\n\n' + 'Deseja realmente restaurar o backup?' ); if (!doubleConfirm) return; setIsImporting(true); try { const fileContent = await selectedFile.text(); const backupData = JSON.parse(fileContent); await api.post('/backup/import', backupData); alert('✅ Backup restaurado com sucesso! A página será recarregada.'); window.location.reload(); } catch (error: unknown) { const err = error as { response?: { data?: { message?: string } }; message?: string }; console.error('Erro ao importar backup:', error); alert(`❌ Erro ao restaurar backup: ${err.response?.data?.message || err.message || 'Erro desconhecido'}`); } finally { setIsImporting(false); } }; const formatDate = (isoString: string) => { const date = new Date(isoString); return date.toLocaleString('pt-BR', { day: '2-digit', month: '2-digit', year: 'numeric', hour: '2-digit', minute: '2-digit' }); }; return (
{/* Header Info */}

Backup e Restauração de Dados

Use esta ferramenta para criar cópias de segurança de todos os dados da organização ou restaurar dados de um backup anterior. Os backups são específicos para cada organização e não podem ser restaurados em outras organizações.

{/* Export Section */}

Exportar Backup

Baixe todos os dados em formato JSON

O que será exportado?

  • Todos os projetos e suas configurações
  • Inspeções e registros de aplicação
  • Fichas técnicas e esquemas de pintura
  • Peças, geometrias e instrumentos
  • Estudos de rendimento
  • Estoque e movimentações

O arquivo será salvo no seu computador com a data e hora atual. Guarde-o em local seguro (pendrive, nuvem, etc).

{/* Import Section */}

Restaurar Backup

Carregue um arquivo de backup JSON

{validationResult && (
{validationResult.valid && validationResult.isValidOrganization ? ( ) : ( )}

{validationResult.message}

{validationResult.valid && (

Data do backup: {formatDate(validationResult.timestamp)}

Versão: {validationResult.version}

Registros no backup:

• Projetos: {validationResult.stats.projects} • Inspeções: {validationResult.stats.inspections} • Fichas: {validationResult.stats.technicalDataSheets} • Esquemas: {validationResult.stats.paintingSchemes} • Peças: {validationResult.stats.parts} • Instrumentos: {validationResult.stats.instruments}
)}
)}

ATENÇÃO: Restaurar um backup irá SUBSTITUIR PERMANENTEMENTE todos os dados atuais. Esta ação não pode ser desfeita!

); };