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) => {
    const { 
        id_firma, 
        id_furnizor, 
        numar_document, 
        id_punct, 
        data_document,
        id_intrare,
        document_int,
        numar_int,
        produse, 
        username,
        totalAchizitie, 
        totalAchizitiecutva, 
        totalVanzare, 
        totalVanzareFaraTva, 
        tvaAchizitie9, 
        tvaAchizitie19, 
        tvaVanzare9, 
        tvaVanzare19,
        totalVanzareTva9,
        totalVanzareTva19,
        totalAchizitieTva9,
        totalAchizitieTva19,
        continueProcess // Adăugat pentru a determina dacă să continuăm
    } = req.body;

    try {
        // START TRANSACTION pentru consistență
        await pool.promise().query('START TRANSACTION');

        // Verificare dacă există o recepție cu același id_furnizor și numar_document
        const [existingRecepit] = await pool.promise().query(
            `SELECT * FROM receptii WHERE id_furnizor = ? AND numar_document = ?`,
            [id_furnizor, numar_document]
        );

        if (existingRecepit.length > 0) {
            await pool.promise().query('ROLLBACK');
            return res.status(400).json({ message: 'Receptia exista in Baza de date' });
        }

        // Verificare dacă există o recepție cu același numar_document
        const [existingDocument] = await pool.promise().query(
            `SELECT * FROM receptii WHERE numar_document = ?`,
            [numar_document]
        );

        if (existingDocument.length > 0) {
            if (!continueProcess) {
                await pool.promise().query('ROLLBACK');
                return res.status(400).json({
                    message: 'Numarul documentului exista. Doriti sa continuati?',
                    continue: false
                });
            }
        }

        // Inserare în tabelul `receptii`
        const [receptieResult] = await pool.promise().query(
            `INSERT INTO receptii 
             (id_firma, id_furnizor, numar_document, id_punct, data_document, id_intrare, document_int, numar_int, username, total_achizitie, total_achizitie_cu_tva, total_vanzare, total_vanzare_cu_tva, tva_achizitie_9, tva_achizitie_19, tva_vanzare_9, tva_vanzare_19, total_vanzare_9, total_vanzare_19, total_achizitie_9, total_achizitie_19)
             VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`,
            [id_firma, id_furnizor, numar_document, id_punct, data_document, id_intrare, document_int, numar_int, username, totalAchizitie, totalAchizitiecutva, totalVanzareFaraTva, totalVanzare, tvaAchizitie9, tvaAchizitie19, tvaVanzare9, tvaVanzare19, totalVanzareTva9, totalVanzareTva19, totalAchizitieTva9, totalAchizitieTva19]
        );
        
        const id_receptie = receptieResult.insertId;

        // Query-uri pentru inserare
        const insertProductsQuery = `
            INSERT INTO produse_receptie 
            (id_receptie, barcode, denumire, cantitate, pret_unitar, pret_vanzare, unitate_masura, valoare_tva, adaos, valoare, id_produs, id_gestiune, cod_gestiune)
            VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
        `;

        const updateProductsQuery = `
            UPDATE products 
            SET price = ?, pret_achizitie = ?, tva_int = ? 
            WHERE id = ?
        `;

        const insertTermenQuery = `
            INSERT INTO termen_valabilitate (id_receptie, id_produs, cantitate, data_expirare)
            VALUES (?, ?, ?, ?)
        `;

      
        for (const produs of produse) {
            const { barcode, denumire, cantitate, pret_unitar, pret_vanzare, unitate_masura, valoare_tva, adaos, valoare, tva_int, id_produs, data_expirare, id_gestiune, cont_gestiune } = produs;

            // Inserare în tabelul `produse_receptie`
            await pool.promise().query(insertProductsQuery, [
                id_receptie, barcode, denumire, cantitate, pret_unitar, 
                pret_vanzare, unitate_masura, valoare_tva, adaos, valoare, 
                id_produs, id_gestiune, cont_gestiune
            ]);

            // Inserare în tabelul `termen_valabilitate`
            await pool.promise().query(insertTermenQuery, [
                id_receptie, id_produs, cantitate, data_expirare || null
            ]);

           
            // Actualizare în tabelul `products`
            await pool.promise().query(updateProductsQuery, [
                pret_vanzare, pret_unitar, tva_int || 0, id_produs
            ]);
        }

        // Update în tabelul `serii_documente`
        await pool.promise().query(
            `UPDATE serii_documente 
             SET ultimul_numar = ? 
             WHERE id_serie = ?`,
            [numar_int, id_intrare]
        );

        // Concatenare `document_int` și `numar_int` pentru coloana `id_document`
        const id_document = `${document_int}_${numar_int}`;

        // Inserare în tabelul `raport_gestiune`
        await pool.promise().query(
            `INSERT INTO raport_gestiune (id_document, data_document, nr_document, val_intrare)
             VALUES (?, ?, ?, ?)`,
            [id_document, data_document, numar_document, totalVanzare]
        );

        // COMMIT tranzacție
        await pool.promise().query('COMMIT');

        res.status(201).json({ message: 'Receptia a fost salvata cu succes!' });
    } catch (err) {
        // ROLLBACK la eroare
        await pool.promise().query('ROLLBACK');
        console.error('Eroare la salvarea recepției:', err.message);
        res.status(500).json({ error: 'Eroare la salvarea recepției' });
    }
});

router.all('/print_receptie', async (req, res) => {
    let document_int, numar_int, continueProcess;

    // Dacă cererea este de tip POST, extragem datele din corpul cererii
    if (req.method === 'POST') {
        ({ document_int, numar_int, continueProcess } = req.body);
    } 
    // Dacă cererea este de tip GET, extragem datele din parametrii URL
    else if (req.method === 'GET') {
        document_int = req.query.document_int;
        numar_int = req.query.numar_int;
        continueProcess = req.query.continueProcess; // opțional
    }

    try {
        // Concatenarea document_int și numar_int pentru a crea id_document
        const id_document = `${document_int}_${numar_int}`;

        // Verificare dacă există o recepție cu același id_document
        const [existingRecepit] = await pool.promise().query(
            `SELECT * FROM receptii WHERE CONCAT(document_int, '_', numar_int) = ?`,
            [id_document]
        );

        if (existingRecepit.length === 0) {
            return res.status(404).json({ message: 'Receptia nu exista in Baza de date' });
        }

        // Extrage id_receptie din rezultatele obținute
        const id_receptie = existingRecepit[0].id_receptie;

        // Selectare date din tabelul `produse_receptie` pe baza `id_receptie`
        const [produse] = await pool.promise().query(
            `SELECT * FROM produse_receptie WHERE id_receptie = ?`,
            [id_receptie]
        );

        // Construirea răspunsului
        const response = {
            receptie: existingRecepit[0],
            produse: produse
        };

        res.status(200).json(response);
    } catch (err) {
        console.error('Eroare la selectarea datelor:', err.message);
        res.status(500).json({ error: 'Eroare la selectarea datelor' });
    }
});

router.delete('/:id_receptie', async (req, res) => {
    const { id_receptie } = req.params;

    try {
        // Verificare dacă există recepția în baza de date
        const [existingRecepit] = await pool.promise().query(
            `SELECT * FROM receptii WHERE id_receptie = ?`,
            [id_receptie]
        );

        if (existingRecepit.length === 0) {
            return res.status(404).json({ message: 'Recepția nu a fost găsită în baza de date' });
        }

        // Start Transaction pentru consistență
        await pool.promise().query('START TRANSACTION');

        // 1. ȘTERGEM MIȘCĂRILE DE STOC ASOCIATE RECEPȚIEI
        await pool.promise().query(
            `DELETE FROM miscari_stoc WHERE tip_document = 'RECEPTIE' AND id_document = ?`,
            [id_receptie]
        );

        // 2. Ștergem produsele asociate acestei recepții
        await pool.promise().query(
            `DELETE FROM produse_receptie WHERE id_receptie = ?`,
            [id_receptie]
        );

        // 3. Ștergem termenele de valabilitate
        await pool.promise().query(
            `DELETE FROM termen_valabilitate WHERE id_receptie = ?`,
            [id_receptie]
        );

        // 4. Ștergem informațiile de raport din tabelul `raport_gestiune`
        await pool.promise().query(
            `DELETE FROM raport_gestiune WHERE id_document = ?`,
            [`${existingRecepit[0].document_int}_${existingRecepit[0].numar_int}`]
        );

        // 5. Actualizăm numărul ultimului document în `serii_documente`
        await pool.promise().query(
            `UPDATE serii_documente 
            SET ultimul_numar = (SELECT MAX(numar_int) FROM receptii WHERE id_intrare = ? AND id_receptie != ?) 
            WHERE id_serie = ?`,
            [existingRecepit[0].id_intrare, id_receptie, existingRecepit[0].id_intrare]
        );

        // 6. Ștergem recepția propriu-zisă din tabelul `receptii`
        await pool.promise().query(
            `DELETE FROM receptii WHERE id_receptie = ?`,
            [id_receptie]
        );

        // 7. Commit la tranzacție pentru a aplica toate modificările
        await pool.promise().query('COMMIT');

        res.status(200).json({ message: 'Recepția a fost ștearsă cu succes și toate legăturile au fost actualizate!' });
    } catch (err) {
        // Dacă apare o eroare, facem rollback pentru a nu afecta baza de date
        await pool.promise().query('ROLLBACK');
        console.error('Eroare la ștergerea recepției:', err.message);
        res.status(500).json({ error: 'Eroare la ștergerea recepției' });
    }
});

router.put('/:id', async (req, res) => {
  const {
    id_firma,
    id_furnizor,
    numar_document,
    id_punct,
    data_document,
    id_intrare,
    document_int,
    numar_int,
    produse,
    username,
    totalAchizitie,
    totalAchizitiecutva,
    totalVanzare,
    totalVanzareFaraTva,
    tvaAchizitie9,
    tvaAchizitie19,
    tvaVanzare9,
    tvaVanzare19,
    totalVanzareTva9,
    totalVanzareTva19,
    totalAchizitieTva9,
    totalAchizitieTva19
  } = req.body;

  const id_receptie = req.params.id;

  try {
    // START TRANSACTION pentru consistență
    await pool.promise().query('START TRANSACTION');

    // Verificare dacă recepția există
    const [existing] = await pool.promise().query(
      `SELECT 1 FROM receptii WHERE id_receptie = ?`,
      [id_receptie]
    );

    if (existing.length === 0) {
      await pool.promise().query('ROLLBACK');
      return res.status(404).json({ message: 'Recepția nu a fost găsită.' });
    }

    // 1. ȘTERGEM MIȘCĂRILE DE STOC VECHI PENTRU ACEASTĂ RECEPȚIE
    await pool.promise().query(
      `DELETE FROM miscari_stoc WHERE tip_document = 'RECEPTIE' AND id_document = ?`,
      [id_receptie]
    );

    // Actualizare în tabelul `receptii`
    await pool.promise().query(
      `UPDATE receptii SET
        id_firma = ?, id_furnizor = ?, numar_document = ?, id_punct = ?, data_document = ?,
        id_intrare = ?, document_int = ?, numar_int = ?, username = ?,
        total_achizitie = ?, total_achizitie_cu_tva = ?,
        total_vanzare = ?, total_vanzare_cu_tva = ?,
        tva_achizitie_9 = ?, tva_achizitie_19 = ?,
        tva_vanzare_9 = ?, tva_vanzare_19 = ?,
        total_vanzare_9 = ?, total_vanzare_19 = ?,
        total_achizitie_9 = ?, total_achizitie_19 = ?
      WHERE id_receptie = ?`,
      [
        id_firma, id_furnizor, numar_document, id_punct, data_document,
        id_intrare, document_int, numar_int, username,
        totalAchizitie, totalAchizitiecutva,
        totalVanzareFaraTva, totalVanzare,
        tvaAchizitie9, tvaAchizitie19,
        tvaVanzare9, tvaVanzare19,
        totalVanzareTva9, totalVanzareTva19,
        totalAchizitieTva9, totalAchizitieTva19,
        id_receptie
      ]
    );

    // Ștergem produsele vechi din `produse_receptie`
    await pool.promise().query(`DELETE FROM produse_receptie WHERE id_receptie = ?`, [id_receptie]);

    // Ștergem termenele de valabilitate vechi
    await pool.promise().query(`DELETE FROM termen_valabilitate WHERE id_receptie = ?`, [id_receptie]);

    // Query-uri pentru inserare
    const insertProdus = `
      INSERT INTO produse_receptie 
      (id_receptie, barcode, denumire, cantitate, pret_unitar, pret_vanzare, unitate_masura, valoare_tva, adaos, valoare, id_produs, id_gestiune, cod_gestiune)
      VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`;

    const insertTermenValabilitate = `
      INSERT INTO termen_valabilitate (id_receptie, id_produs, cantitate, data_expirare)
      VALUES (?, ?, ?, ?)
    `;

    const updateProdus = `
      UPDATE products 
      SET price = ?, pret_achizitie = ?, tva_int = ?
      WHERE id = ?
    `;

   

    // Inserare produse noi
    for (const produs of produse) {
      const {
        barcode,
        denumire,
        cantitate,
        pret_unitar,
        pret_vanzare,
        unitate_masura,
        valoare_tva,
        adaos,
        valoare,
        tva_int,
        id_produs,
        data_expirare,
        id_gestiune,
        cont_gestiune
      } = produs;

      // Inserare în produse_receptie
      await pool.promise().query(insertProdus, [
        id_receptie, barcode, denumire, cantitate, pret_unitar,
        pret_vanzare, unitate_masura, valoare_tva, adaos, valoare, 
        id_produs, id_gestiune, cont_gestiune
      ]);

      // Inserare în termen_valabilitate
      await pool.promise().query(insertTermenValabilitate, [
        id_receptie, id_produs, cantitate, data_expirare || null
      ]);

   

      // Actualizare products
      await pool.promise().query(updateProdus, [
        pret_vanzare, pret_unitar, tva_int || 0, id_produs
      ]);
    }

    // Actualizare în raport_gestiune
    const id_document = `${document_int}_${numar_int}`;
    await pool.promise().query(
      `UPDATE raport_gestiune 
       SET data_document = ?, nr_document = ?, val_intrare = ?
       WHERE id_document = ?`,
      [data_document, numar_document, totalVanzare, id_document]
    );

    // COMMIT tranzacție
    await pool.promise().query('COMMIT');

    res.status(200).json({ message: 'Recepția a fost actualizată cu succes!' });

  } catch (err) {
    // ROLLBACK la eroare
    await pool.promise().query('ROLLBACK');
    console.error('Eroare la actualizarea recepției:', err.message);
    res.status(500).json({ error: 'Eroare la actualizarea recepției' });
  }
});

module.exports = router;