import { Router, Request, Response } from 'express';
import { backupService } from '../services/backupService.js';
import { requireRole } from '../middleware/authMiddleware.js';

const router = Router();

/**
 * GET /api/backup/export
 * Exporta todos os dados da organização como JSON para download
 */
router.get('/export', requireRole(['admin']), async (req: Request, res: Response) => {
    try {
        const organizationId = req.headers['x-organization-id'] as string;

        if (!organizationId) {
            return res.status(400).json({ message: 'Organization ID não fornecido' });
        }

        const backupData = await backupService.exportData(organizationId);

        // Gera nome do arquivo com timestamp
        const timestamp = new Date().toISOString().replace(/[:.]/g, '-').slice(0, -5);
        const filename = `backup_${timestamp}.json`;

        // Define headers para download
        res.setHeader('Content-Type', 'application/json');
        res.setHeader('Content-Disposition', `attachment; filename="${filename}"`);

        res.json(backupData);
    } catch (error) {
        console.error('Erro ao exportar backup:', error);
        res.status(500).json({ message: 'Erro ao gerar backup' });
    }
});

/**
 * POST /api/backup/import
 * Importa dados de um arquivo de backup JSON
 */
router.post('/import', requireRole(['admin']), async (req: Request, res: Response) => {
    try {
        const organizationId = req.headers['x-organization-id'] as string;
        const backupData = req.body;

        if (!organizationId) {
            return res.status(400).json({ message: 'Organization ID não fornecido' });
        }

        if (!backupData || !backupData.version || !backupData.data) {
            return res.status(400).json({ message: 'Formato de backup inválido' });
        }

        // Validação adicional: verifica se o backup é da mesma organização
        if (backupData.organizationId !== organizationId) {
            return res.status(403).json({
                message: 'Este backup pertence a outra organização e não pode ser restaurado aqui'
            });
        }

        await backupService.importData(backupData, organizationId);

        res.json({
            message: 'Backup restaurado com sucesso',
            stats: backupService.getBackupStats(backupData)
        });
    } catch (error: any) {
        console.error('Erro ao importar backup:', error);
        res.status(500).json({
            message: error.message || 'Erro ao restaurar backup'
        });
    }
});

/**
 * POST /api/backup/validate
 * Valida um arquivo de backup sem importá-lo
 */
router.post('/validate', requireRole(['admin']), async (req: Request, res: Response) => {
    try {
        const organizationId = req.headers['x-organization-id'] as string;
        const backupData = req.body;

        if (!organizationId) {
            return res.status(400).json({ message: 'Organization ID não fornecido' });
        }

        if (!backupData || !backupData.version || !backupData.data) {
            return res.status(400).json({
                valid: false,
                message: 'Formato de backup inválido'
            });
        }

        const isValidOrganization = backupData.organizationId === organizationId;
        const stats = backupService.getBackupStats(backupData);

        res.json({
            valid: true,
            isValidOrganization,
            version: backupData.version,
            timestamp: backupData.timestamp,
            organizationId: backupData.organizationId,
            stats,
            message: isValidOrganization
                ? 'Backup válido e compatível com esta organização'
                : 'Backup válido, mas pertence a outra organização'
        });
    } catch (error) {
        console.error('Erro ao validar backup:', error);
        res.status(400).json({
            valid: false,
            message: 'Erro ao validar arquivo de backup'
        });
    }
});

export default router;
