/* --- ÚJ VÉGPONTOK GYAKORLÁSHOZ / TOVÁBBFEJLESZTÉSHEZ --- */

/*
// 1. EGYSZERŰ GET (Keresés ID alapján)
// Lekérdez egy konkrét terméket az ID-je alapján.
router.get('/termek/:id', async (req, res) => {
    try {
        const termek = await Termek.findById(req.params.id)
            .populate('gyartoId', 'nev -_id')
            .populate('kategoriaId', 'nev -_id');
        
        if (!termek) {
            return res.status(404).json({ message: 'Termék nem található!' });
        }
        return res.status(200).json(termekValaszObjektum(termek));
    } catch (error) {
        return res.status(500).json({ message: error.message });
    }
});

// 2. EGYSZERŰ GET SZŰRÉS (Allergénmentes termékek)
// Csak azokat a termékeket adja vissza, amelyeknek az 'allergenek' tömbje üres.
router.get('/allergia-mentes', async (req, res) => {
    try {
        const mentesTermekek = await Termek.find({ allergenek: { $size: 0 } })
            .populate('gyartoId', 'nev -_id');
        return res.status(200).json(mentesTermekek);
    } catch (error) {
        return res.status(500).json({ message: error.message });
    }
});

// 3. EGYSZERŰ POST (Új adat felvitele)
// Ezzel a végponttal újat lehet menteni az adatbázisba a küldött JSON body alapján.
router.post('/termek', async (req, res) => {
    try {
        const ujTermek = new Termek(req.body);
        const mentve = await ujTermek.save();
        return res.status(201).json(mentve);
    } catch (error) {
        // A mongoose validációs hiba miatt itt érdemes 400-as (Bad Request) kódot adni
        return res.status(400).json({ message: error.message }); 
    }
});

// 4. KÖZEPES AGGREGÁCIÓ (Termékszám statisztika kategóriánként)
// MongoDB aggregáció: Csoportosítja a termékeket kategóriák szerint, majd megszámolja ($sum: 1)
// hogy melyik kategóriában hány darab termékünk van, végül a $lookup hozzárendeli a kategória nevét.
router.get('/statisztika/kategoriak', async (req, res) => {
    try {
        const stat = await Termek.aggregate([
            { $group: { _id: "$kategoriaId", termekDb: { $sum: 1 } } },
            { $lookup: { from: 'kategoriak', localField: '_id', foreignField: '_id', as: 'katAdat' } },
            { $unwind: "$katAdat" },
            { $project: { kategoriaNev: "$katAdat.nev", termekDb: 1, _id: 0 } },
            { $sort: { termekDb: -1 } } // legtöbb termékű kategória legyen elöl
        ]);
        return res.status(200).json(stat);
    } catch (error) {
        return res.status(500).json({ message: error.message });
    }
});

// 5. KÖZEPES/NEHÉZ AGGREGÁCIÓ (Átlagárak gyártónként kerekítve)
// Kiszámolja, hogy az egyes gyártók termékei átlagosan mennyibe kerülnek, mi a legdrágább 
// és legolcsóbb termékük, majd rákapcsolja a gyártó nevét is.
router.get('/statisztika/gyartok-araj', async (req, res) => {
    try {
        const stat = await Termek.aggregate([
            { $group: { 
                _id: "$gyartoId", 
                atlagAr: { $avg: "$ar" }, 
                legdragabb: { $max: "$ar" }, 
                legolcsobb: { $min: "$ar" } 
            }},
            { $lookup: { from: 'gyartok', localField: '_id', foreignField: '_id', as: 'gyartoAdat' } },
            { $unwind: "$gyartoAdat" },
            // A $round kerekíti az átlagárat egész számra
            { $project: { gyartoNev: "$gyartoAdat.nev", atlagAr: { $round: ["$atlagAr", 0] }, legdragabb: 1, legolcsobb: 1, _id: 0 } }
        ]);
        return res.status(200).json(stat);
    } catch (error) {
        return res.status(500).json({ message: error.message });
    }
});

// 6. BONYOLULT AGGREGÁCIÓ (Közeli lejárati dátumú termékek "akciózása")
// Olyan termékeket keres, amik a következő 30 napban járnak le, majd dinamikusan - aggregációs szinten -
// hozzáad a válaszhoz egy 'akciosAr' mezőt, ami a valós ár 80%-a (20% kedvezmény),
// és kiszámolja a még hátralévő napok számát pontosan.
router.get('/akciok/kozeli-lejarat', async (req, res) => {
    try {
        const aktualisDatum = new Date();
        const harmincNaponBelul = new Date();
        harmincNaponBelul.setDate(harmincNaponBelul.getDate() + 30);
        
        const akciosTermekek = await Termek.aggregate([
            { 
                $match: { 
                    lejaratiDatum: { $lte: harmincNaponBelul, $gt: aktualisDatum } 
                } 
            },
            // Az $addFields újonnan generált mezőket szúr az eredményhez anélkül, hogy a db-ben módosítana
            { 
                $addFields: { 
                    eredetiAr: "$ar",
                    akciosAr: { $multiply: ["$ar", 0.8] }, // 20% olcsóbb
                    hatralevoNapok: { 
                        $dateDiff: { startDate: aktualisDatum, endDate: "$lejaratiDatum", unit: "day" }
                    }
                }
            },
            { $sort: { hatralevoNapok: 1 } }, // Ami a leghamarabb lejár, az legyen elől
            { $project: { _id: 1, nev: 1, eredetiAr: 1, akciosAr: 1, hatralevoNapok: 1, lejaratiDatum: 1 } }
        ]);
        
        return res.status(200).json(akciosTermekek);
    } catch (error) {
        return res.status(500).json({ message: error.message });
    }
});

// 7. EGYSZERŰ PUT (Módosítás ID alapján)
// Egy meglévő termék adatainak frissítése. A req.body tartalmazza az új adatokat (pl. Postman-ből küldve JSON-ként).
router.put('/termek/:id', async (req, res) => {
    try {
        const frissitettTermek = await Termek.findByIdAndUpdate(
            req.params.id, 
            req.body, 
            { new: true, runValidators: true } // Visszaadja az új állapotot, és lefuttatja a beállított szabályok ellenőrzését
        );
        
        if (!frissitettTermek) {
            return res.status(404).json({ message: 'A módosítani kívánt termék nem található!' });
        }
        return res.status(200).json(frissitettTermek);
    } catch (error) {
        return res.status(400).json({ message: error.message });
    }
});

// 8. EGYSZERŰ DELETE (Törlés egyedi ID alapján)
// Egy konkrét termék törlése az azonosítója (ID) alapján. URL példa: DELETE /api/termek/3
router.delete('/termek/:id', async (req, res) => {
    try {
        const toroltTermek = await Termek.findByIdAndDelete(req.params.id);
        
        if (!toroltTermek) {
            return res.status(404).json({ message: 'A törölni kívánt termék nem található!' });
        }
        return res.status(200).json({ message: 'Sikeres törlés!', torolt: toroltTermek.nev });
    } catch (error) {
        return res.status(500).json({ message: error.message });
    }
});

// 9. EGYSZERŰ SZŰRÉS (Keresés termék nevében)
// Részletes egyezést is megtalál, kis/nagybetű mindegy neki. URL példa: /api/kereses?nev=whey
router.get('/kereses', async (req, res) => {
    try {
        const { nev } = req.query;
        if (!nev) {
            return res.status(400).json({ message: 'Adj meg egy szót a "?nev=" paraméterben!' });
        }
        
        // A $regex keres töredék szavakat is, az $options: 'i' jelentése "case-insensitive" (nem tesz különbséget kis- és nagybetű közt)
        const eredmenyek = await Termek.find({ nev: { $regex: nev, $options: 'i' } })
            .populate('gyartoId', 'nev -_id');
            
        return res.status(200).json(eredmenyek);
    } catch (error) {
        return res.status(500).json({ message: error.message });
    }
});

// 10. EGYSZERŰ SZŰRÉS (Termékek ártartomány szerint)
// Kilistázza a termékeket ár szerint szűrve. URL példa: /api/ar-szures?min=1000&max=5000
router.get('/ar-szures', async (req, res) => {
    try {
        // Ha nem küld adatot, 0 a minimum és 100 millió a maximum ár alapértelmezetten
        const minAr = Number(req.query.min) || 0;
        const maxAr = Number(req.query.max) || 100000000; 

        const szurtTermekek = await Termek.find({
            ar: { $gte: minAr, $lte: maxAr } // $gte = Greater-Than-Equal (>=), $lte = Less-Than-Equal (<=)
        }).sort({ ar: 1 }); // Ár szerint rögtön növekvő sorrendbe is rakja ($sort: 1)

        return res.status(200).json(szurtTermekek);
    } catch (error) {
        return res.status(500).json({ message: error.message });
    }
});

// 11. EGYSZERŰ GET (Összes kategória egy egyszerű listaként)
// Sima listázó végpont, minden kategóriát lekér.
router.get('/kategoriak', async (req, res) => {
    try {
        const kats = await Kategoria.find();
        return res.status(200).json(kats);
    } catch (error) {
        return res.status(500).json({ message: error.message });
    }
});
*/