// api.mebboat.it/api/users

const router = require('express').Router();
const { query } = require('../storage/database');
const userAuth = require('../middlewares/user.security');
const internalAuth = require('../middlewares/internal.security');

const USERNAME_REGEX = /^[a-zA-Z0-9_.\-]{3,50}$/;
const TELEGRAM_ID_REGEX = /^[0-9]{5,15}$/;


router.get('/', internalAuth, async (req, res) => {
    try {
        const result = await query(
            'SELECT id, username, is_active, created_at, telegram_id FROM users'
        );
        res.json(result.rows);
    } catch (err) {
        console.error('[USERS] Errore lista utenti:', err);
        res.status(500).json({ error: 'Errore interno del server' });
    }
});

router.get('/tonotify', internalAuth, async (req, res) => {
    try {
        const result = await query(
            'SELECT telegram_id FROM users WHERE telegram_id IS NOT NULL'
        );
        res.json(result.rows);
    } catch (err) {
        console.error('[USERS] Errore lista notifiche:', err);
        res.status(500).json({ error: 'Errore interno del server' });
    }
});

// ─── ROTTE USER (tutte le rotte sotto usano userAuth) ───────────────

router.use(userAuth);

router.get('/me', async (req, res) => {
    try {
        const result = await query(
            'SELECT id, username, is_active, created_at, telegram_id FROM users WHERE id = $1',
            [req.user.user_id]
        );

        if (result.rows.length === 0) {
            return res.status(404).json({ error: 'Utente non trovato' });
        }

        res.json(result.rows[0]);
    } catch (err) {
        console.error('[USERS] Errore recupero utente:', err);
        res.status(500).json({ error: 'Errore interno del server' });
    }
});

router.put('/me/username', async (req, res) => {
    const newUsername = req.query.newUsername || req.body?.newUsername;

    if (!newUsername || typeof newUsername !== 'string') {
        return res.status(400).json({ error: 'Nuovo username richiesto' });
    }

    // Validazione formato username
    if (!USERNAME_REGEX.test(newUsername)) {
        return res.status(400).json({ 
            error: 'Username non valido. Deve contenere 3-50 caratteri alfanumerici, underscore, punto o trattino.' 
        });
    }

    try {
        const result = await query(
            'UPDATE users SET username = $1 WHERE id = $2 RETURNING username',
            [newUsername, req.user.user_id]
        );

        if (result.rowCount === 0) {
            return res.status(404).json({ error: 'Utente non trovato' });
        }

        res.json({ success: true, username: result.rows[0].username });
    } catch (err) {
        if (err.code === '23505') {
            return res.status(409).json({ error: 'Questo username è già in uso' });
        }
        console.error('[USERS] Errore aggiornamento username:', err);
        res.status(500).json({ error: 'Errore interno del server' });
    }
});

router.put('/me/telegram', async (req, res) => {
    const telegramId = req.query.telegramId || req.body?.telegramId;

    if (!telegramId || typeof telegramId !== 'string') {
        return res.status(400).json({ error: 'Telegram ID richiesto' });
    }

    // Validazione formato Telegram ID (solo numeri, 5-15 cifre)
    if (!TELEGRAM_ID_REGEX.test(telegramId)) {
        return res.status(400).json({ 
            error: 'Telegram ID non valido. Deve contenere solo numeri (5-15 cifre).' 
        });
    }

    try {
        await query(
            'UPDATE users SET telegram_id = $1 WHERE id = $2',
            [telegramId, req.user.user_id]
        );
        res.json({ success: true, message: 'Telegram ID aggiornato' });
    } catch (err) {
        if (err.code === '23505') {
            return res.status(409).json({ error: 'Questo Telegram ID è già associato a un altro account' });
        }
        console.error('[USERS] Errore aggiornamento telegram:', err);
        res.status(500).json({ error: 'Errore interno del server' });
    }
});

module.exports = router;
