const express = require('express');
const router = express.Router();

// Importă conexiunea la baza de date
const pool = require('../db'); 

// Importă middleware-ul de autentificare
const authenticateToken = require('../middleware/auth');

// Endpoint pentru a obține produsele - protejează ruta cu middleware-ul de autentificare
router.get('/mod_incasare', async (req, res) => {
    try {
        const [results] = await pool.promise().query('SELECT nume_incasare, id_incasare FROM mod_incasare');
        res.json(results);
    } catch (err) {
        console.error('Error fetching payment methods:', err);
        res.status(500).send('Internal Server Error');
    }
});
router.get('/suma_operatii', async (req, res) => {
    const dataDorita = req.query.data;

    if (!dataDorita || isNaN(Date.parse(dataDorita))) {
        return res.status(400).json({ error: 'Data validă trebuie specificată în formatul YYYY-MM-DD' });
    }

    try {
        // Obținem toate id_incasare și nume_incasare
        const idIncasareQuery = `SELECT id_incasare, nume_incasare FROM mod_incasare;`;
        const [idIncasareResults] = await pool.promise().query(idIncasareQuery);

        if (idIncasareResults.length === 0) {
            return res.status(404).json({ error: 'Nu s-au găsit înregistrări în mod_incasare' });
        }

        // Obținem suma totală pentru fiecare id_incasare
        const sumQueries = idIncasareResults.map(async (incasare) => {
            const modIncasareBonQuery = `
                SELECT SUM(valoare_total) AS suma_total
                FROM moduri_incasare_bon
                WHERE id_incasare = ? AND DATE(date) = ?;
            `;
            const [modIncasareBonResults] = await pool.promise().query(modIncasareBonQuery, [incasare.id_incasare, dataDorita]);

            return {
                id_incasare: incasare.id_incasare,
                nume_incasare: incasare.nume_incasare,
                suma_total: parseFloat(modIncasareBonResults[0].suma_total) || 0
            };
        });

        const sumResults = await Promise.all(sumQueries);

        // Obținem suma pentru data specificată din tabelul operatii_sertar
        const operatiiQuery = `
            SELECT 
                DATE(data_operatie) AS data_operatie,
                SUM(CASE WHEN actiune = 0 THEN valoare_operatie ELSE 0 END) AS suma_actiune_0,
                SUM(CASE WHEN actiune = 1 THEN valoare_operatie ELSE 0 END) AS suma_actiune_1,
                SUM(CASE WHEN actiune = 0 THEN valoare_operatie ELSE 0 END) - 
                SUM(CASE WHEN actiune = 1 THEN valoare_operatie ELSE 0 END) AS diferenta_sume
            FROM operatii_sertar
            WHERE DATE(data_operatie) = ?
            GROUP BY DATE(data_operatie)
            ORDER BY DATE(data_operatie);
        `;
        const [operatiiResults] = await pool.promise().query(operatiiQuery, [dataDorita]);

        // Calculăm suma totală aferentă nume_incasare "Numerar"
        const numerarIncasare = sumResults.find(incasare => incasare.nume_incasare === 'Numerar');
        const sumaNumerar = numerarIncasare ? numerarIncasare.suma_total : 0;

        // Calculăm diferența totală
        const diferencaSumeTotal = operatiiResults.length > 0
            ? parseFloat(operatiiResults[0].diferenta_sume) + sumaNumerar
            : sumaNumerar;

        // Combinați rezultatele
        const result = {
            operatii: operatiiResults,
            suma_totala_per_id_incasare: sumResults,
            suma_numerar: sumaNumerar,
            diferenca_sume_total: diferencaSumeTotal.toFixed(2) // Asigură-te că este formatat corect
        };

        res.json(result);
    } catch (err) {
        console.error('Database error:', err);
        res.status(500).json({ error: 'Database error', details: err.message });
    }
});

router.get('/incasari-data', async (req, res) => {
    const startDate = req.query.startDate;
    const endDate = req.query.endDate;

    if (!startDate || !endDate || isNaN(Date.parse(startDate)) || isNaN(Date.parse(endDate))) {
        return res.status(400).json({ error: 'Start date și end date valide trebuie specificate în formatul YYYY-MM-DD' });
    }

    try {
        // Obținem toate id_incasare și nume_incasare
        const idIncasareQuery = `SELECT id_incasare, nume_incasare FROM mod_incasare;`;
        const [idIncasareResults] = await pool.promise().query(idIncasareQuery);

        if (idIncasareResults.length === 0) {
            return res.status(404).json({ error: 'Nu s-au găsit înregistrări în mod_incasare' });
        }

        // Obținem suma totală pentru fiecare id_incasare grupate pe date
        const sumQueries = idIncasareResults.map(async (incasare) => {
            const modIncasareBonQuery = `
                SELECT 
                    DATE(date) AS date,
                    SUM(valoare_total) AS suma_total
                FROM moduri_incasare_bon
                WHERE id_incasare = ? AND DATE(date) BETWEEN ? AND ?
                GROUP BY DATE(date)
                HAVING SUM(valoare_total) > 0
                ORDER BY DATE(date);
            `;
            const [modIncasareBonResults] = await pool.promise().query(modIncasareBonQuery, [incasare.id_incasare, startDate, endDate]);

            // Returnăm doar dacă există rezultate
            if (modIncasareBonResults.length > 0) {
                return {
                    id_incasare: incasare.id_incasare,
                    nume_incasare: incasare.nume_incasare,
                    results: modIncasareBonResults.map(row => ({
                        date: row.date,
                        suma_total: parseFloat(row.suma_total) || 0
                    }))
                };
            }
            return null;
        });

        const sumResults = (await Promise.all(sumQueries)).filter(item => item !== null);

        // Obținem sumele din tabelul operatii_sertar (doar dacă sunt necesare)
        const operatiiQuery = `
            SELECT 
                DATE(data_operatie) AS date,
                SUM(CASE WHEN actiune = 0 THEN valoare_operatie ELSE 0 END) AS suma_actiune_0,
                SUM(CASE WHEN actiune = 1 THEN valoare_operatie ELSE 0 END) AS suma_actiune_1,
                SUM(CASE WHEN actiune = 0 THEN valoare_operatie ELSE 0 END) - 
                SUM(CASE WHEN actiune = 1 THEN valoare_operatie ELSE 0 END) AS diferenta_sume
            FROM operatii_sertar
            WHERE DATE(data_operatie) BETWEEN ? AND ?
            GROUP BY DATE(data_operatie)
            HAVING (SUM(CASE WHEN actiune = 0 THEN valoare_operatie ELSE 0 END) - 
                   SUM(CASE WHEN actiune = 1 THEN valoare_operatie ELSE 0 END)) > 0
            ORDER BY DATE(data_operatie);
        `;
        const [operatiiResults] = await pool.promise().query(operatiiQuery, [startDate, endDate]);

        // Combinați rezultatele
        const result = {
            date_range: {
                start_date: startDate,
                end_date: endDate
            },
            operatii: operatiiResults,
            metode_incasare: sumResults
        };

        res.json(result);
    } catch (err) {
        console.error('Database error:', err);
        res.status(500).json({ error: 'Database error', details: err.message });
    }
});
module.exports = router;
