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.post('/', async (req, res) => {
    console.log("Date primite de backend:", req.body);
    try {
        const { facturi, id_firma, id_furnizor, data, valoare_totala, serie_plata, numar_plata, detalii_plata, username } = req.body;

        if (!facturi || facturi.length === 0) {
            return res.status(400).json({ error: "Nu s-au selectat facturi!" });
        }

        // ✅ Verificăm dacă există deja o plată cu același id_furnizor și numar_plata
        const [existingRows] = await pool.promise().query(
            "SELECT id_plata FROM plati WHERE id_furnizor = ? AND numar_plata = ?",
            [id_furnizor, numar_plata]
        );

        if (existingRows.length > 0) {
            return res.status(409).json({ error: "Plata există deja în baza de date!" });
        }

        // Inserăm chitanța
        const [chitantaResult] = await pool.promise().query(
            "INSERT INTO plati(id_firma, id_furnizor, data, valoare, serie_plata, numar_plata, detalii, username) VALUES (?, ?, ?, ?, ?, ?, ?, ?)",
            [id_firma, id_furnizor, data, valoare_totala, serie_plata, numar_plata, detalii_plata, username]
        );

        const id_chitanta = chitantaResult.insertId;

        // Legăm fiecare factură de chitanță și actualizăm restul de plată
        for (let { id_factura, suma_incasata } of facturi) {
            await pool.promise().query(
                "INSERT INTO plati_detalii (id_plata, id_factura, suma) VALUES (?, ?, ?)",
                [id_chitanta, id_factura, suma_incasata]
            );
        }

        // Trimite răspunsul către client
        res.json({ message: "Plata înregistrată cu succes!", id_plata: id_chitanta });

    } catch (error) {
        console.error(error);
        return res.status(500).json({ error: 'Eroare server!' });
    }
});
router.post('/alte-plati', async (req, res) => {
    console.log("Date primite de backend:", req.body);
    try {
        const { facturi, id_firma, id_furnizor, data, valoare_totala, serie_plata, numar_plata, detalii_plata, username } = req.body;

        if (!facturi || facturi.length === 0) {
            return res.status(400).json({ error: "Nu s-au selectat facturi!" });
        }

        // ✅ Verificăm dacă există deja o plată cu același id_furnizor și numar_plata
        const [existingRows] = await pool.promise().query(
            "SELECT id_plata FROM plati WHERE id_furnizor = ? AND numar_plata = ?",
            [id_furnizor, numar_plata]
        );

        if (existingRows.length > 0) {
            return res.status(409).json({ error: "Plata există deja în baza de date!" });
        }

        // Inserăm chitanța
        const [chitantaResult] = await pool.promise().query(
            "INSERT INTO plati(id_firma, id_furnizor, data, valoare, serie_plata, numar_plata, detalii, username) VALUES (?, ?, ?, ?, ?, ?, ?, ?)",
            [id_firma, id_furnizor, data, valoare_totala, serie_plata, numar_plata, detalii_plata, username]
        );

        const id_chitanta = chitantaResult.insertId;

        // Legăm fiecare factură de chitanță și actualizăm restul de plată
        for (let { id_factura, suma_incasata } of facturi) {
            await pool.promise().query(
                "INSERT INTO plati_detalii (id_plata, id_factura, suma) VALUES (?, ?, ?)",
                [id_chitanta, 0, suma_incasata]
            );
        }

        // Trimite răspunsul către client
        res.json({ message: "Plata înregistrată cu succes!", id_plata: id_chitanta });

    } catch (error) {
        console.error(error);
        return res.status(500).json({ error: 'Eroare server!' });
    }
});

router.get('/:id_factura', async (req, res) => {
    try {
        const { id_factura } = req.params;

        // Preia toate chitanțele aferente id_factura
        const [chitante] = await pool.promise().query(
            `SELECT  cf.id_factura, cf.suma, c.data, c.serie_plata, c.numar_plata
            FROM plati_detalii cf
            JOIN plati c ON cf.id_plata = c.id_plata
            WHERE cf.id_factura = ?`,
           [id_factura]
        );

        res.status(200).json({ chitante });
    } catch (error) {
        console.error(error);
        res.status(500).json({ error: 'Eroare server!' });
    }
});
router.get('/chitanta/:numar_chitanta', async (req, res) => { 
    try {
        const { numar_chitanta } = req.params;

        // Obține id_plata și valoare pe baza numar_chitanta
        const [chitanta] = await pool.promise().query(
            `SELECT id_plata, valoare FROM plati WHERE numar_plata = ?`,
            [numar_chitanta]
        );

        if (chitanta.length === 0) {
            return res.status(404).json({ error: 'Chitanța nu a fost găsită!' });
        }

        const { id_plata, valoare } = chitanta[0];  // Corectat id_chitanta → id_plata

        // Preia toate înregistrările id_factura și suma din plati_detalii
        const [chitanteFacturi] = await pool.promise().query(
            `SELECT id_factura, suma FROM plati_detalii WHERE id_plata = ?`,
            [id_plata]  // Corectat id_chitanta → id_plata
        );

        if (chitanteFacturi.length === 0) {
            return res.status(404).json({ error: 'Nu există facturi asociate acestei chitanțe!' });
        }

        // Extrage toate id_factura pentru a prelua datele aferente
        const idFacturi = chitanteFacturi.map(row => row.id_factura); // Corectat id_receptie → id_factura

        if (idFacturi.length === 0) {
            return res.status(404).json({ error: 'Nu există facturi chitanțe!' });
        }

        // Preia data_document pentru toate facturile relevante
        const [facturi] = await pool.promise().query(
            `SELECT id_receptie, data_document FROM receptii WHERE id_receptie IN (?)`,
            [idFacturi]
        );

        // Crează un obiect map pentru asocierea id_factura cu data_document
        const facturiMap = new Map(facturi.map(f => [f.id_receptie, f.data_document]));

        // Construiește rezultatul combinând datele
        const rezultat = chitanteFacturi.map(chitanta => ({
            id_receptie: chitanta.id_factura, // Corectat id_receptie → id_factura
            suma: chitanta.suma,
            data_document: facturiMap.get(chitanta.id_factura) || null
        }));

        res.status(200).json({ valoare, chitante: rezultat });
    } catch (error) {
        console.error(error);
        res.status(500).json({ error: 'Eroare server!' });
    }
});


router.get('/numar/serie_chitanta', async (req, res) => {
    try {
        const [serii] = await pool.promise().query(
            'SELECT serie_document, ultimul_numar + 1 AS urmatorul_numar FROM serii_documente WHERE nume_document = "Chitanta" LIMIT 1'
        );

        console.log("Rezultat SQL:", serii); // ✅ Vezi exact ce returnează MySQL

        if (!serii || serii.length === 0) {
            return res.status(404).json({ error: "Nu s-a găsit seria documentului pentru Chitanța." });
        }

        res.status(200).json({ 
            serie_document: serii[0].serie_document, 
            urmatorul_numar: serii[0].urmatorul_numar 
        });

    } catch (error) {
        console.error("Eroare SQL:", error);
        res.status(500).json({ error: 'Eroare server!' });
    }
});




router.get('/facturi/:id_furnizor', async (req, res) => {
    try {
        const { id_furnizor } = req.params;

        // Verifică dacă furnizorul există
        const [furnizor] = await pool.promise().query(
            'SELECT * FROM receptii WHERE id_furnizor = ?',
            [id_furnizor]
        );

        if (!furnizor || furnizor.length === 0) {
            return res.status(404).json({ error: "Furnizorul nu există!" });
        }

        // Selectează toate facturile furnizorului
        const [facturi] = await pool.promise().query(
            'SELECT * FROM receptii WHERE id_furnizor = ?',
            [id_furnizor]
        );

       
       

        if (!facturi || facturi.length === 0) {
            return res.status(404).json({ error: "Nu există facturi pentru acest furnizor!" });
        }

        res.status(200).json(facturi); // Trimite toate facturile corect
    } catch (error) {
        console.error('Eroare la interogarea bazei de date:', error);
        res.status(500).json({ error: 'Eroare server!' });
    }
});
// Endpoint pentru a obține următorul id_factura
router.get('/next-id-factura', async (req, res) => {
    try {
        const [rows] = await pool.promise().query('SELECT MAX(id_factura) as lastId FROM facturi');
        const nextId = (rows[0].lastId || 0); // Dacă nu există înregistrări, începe de la 1
        
        res.json({ nextId });
    } catch (error) {
        console.error('Eroare la extragerea ultimului ID:', error);
        res.status(500).json({ error: 'Eroare la server' });
    }
});





module.exports = router;
