const express = require('express');
const router = express.Router();
const db = require('../db');
const { requireAuth, requireSuperAdmin } = require('../middleware/auth');
const multer = require('multer');
const path = require('path');
const fs = require('fs');

// Garantir que a pasta uploads existe
const uploadDir = 'uploads/';
if (!fs.existsSync(uploadDir)) {
    fs.mkdirSync(uploadDir, { recursive: true });
}

// Configuração do Multer
const storage = multer.diskStorage({
    destination: (req, file, cb) => {
        cb(null, uploadDir);
    },
    filename: (req, file, cb) => {
        const uniqueSuffix = Date.now() + '-' + Math.round(Math.random() * 1E9);
        cb(null, 'update-' + uniqueSuffix + path.extname(file.originalname));
    }
});

const upload = multer({
    storage: storage,
    fileFilter: (req, file, cb) => {
        if (path.extname(file.originalname).toLowerCase() === '.zip') {
            cb(null, true);
        } else {
            cb(new Error('Apenas arquivos .zip são permitidos'));
        }
    }
});

/**
 * POST /api/admin/updates/upload
 * Faz o upload do arquivo ZIP e retorna o link
 */
router.post('/updates/upload', requireAuth, requireSuperAdmin, upload.single('zipFile'), async (req, res) => {
    try {
        if (!req.file) {
            return res.status(400).json({ error: 'Nenhum arquivo enviado' });
        }

        const baseUrl = process.env.API_BASE_URL || `${req.protocol}://${req.get('host')}`;
        const fileLink = `${baseUrl}/uploads/${req.file.filename}`;

        res.json({ url: fileLink });
    } catch (err) {
        console.error('[AdminUpdate] Erro no upload:', err);
        res.status(500).json({ error: 'Erro ao processar upload' });
    }
});

/**
 * GET /api/admin/updates
 * Retorna as configurações atuais de atualização
 */
router.get('/updates', requireAuth, requireSuperAdmin, async (req, res) => {
    try {
        const [rows] = await db.execute('SELECT * FROM app_settings');
        const settings = {};
        rows.forEach(r => settings[r.setting_key] = r.setting_value);
        res.json(settings);
    } catch (err) {
        res.status(500).json({ error: 'Erro ao buscar configurações' });
    }
});

/**
 * POST /api/admin/updates
 * Atualiza versão, url ou notas
 */
router.post('/updates', requireAuth, requireSuperAdmin, async (req, res) => {
    const { version, url, notes } = req.body;

    if (!version || !url) {
        return res.status(400).json({ error: 'Versão e URL são obrigatórios' });
    }

    try {
        await db.execute('INSERT INTO app_settings (setting_key, setting_value) VALUES ("extension_version", ?) ON DUPLICATE KEY UPDATE setting_value = VALUES(setting_value)', [version]);
        await db.execute('INSERT INTO app_settings (setting_key, setting_value) VALUES ("download_url", ?) ON DUPLICATE KEY UPDATE setting_value = VALUES(setting_value)', [url]);
        await db.execute('INSERT INTO app_settings (setting_key, setting_value) VALUES ("release_notes", ?) ON DUPLICATE KEY UPDATE setting_value = VALUES(setting_value)', [notes || '']);

        await db.addLog(req.user.id, 'APP_SETTINGS_UPDATE', `Versão ${version} — URL: ${url}`, 'system', req.ip);

        res.json({ message: 'Configurações atualizadas com sucesso' });
    } catch (err) {
        console.error('[AdminUpdate] Erro:', err);
        res.status(500).json({ error: 'Erro ao salvar no banco' });
    }
});

module.exports = router;
