// services/StocService.js
const pool = require('../db');

class StocService {
    /**
     * Calculează stocul la o dată specificată
     */
    async getStocLaData(data, gestiuneId = null) {
        let query = `
            SELECT 
                ms.id_produs,
                p.name AS denumire_produs,
                p.barcode,
                p.unit_of_measure,
                ms.id_gestiune,
                g.denumire_gestiune,
                SUM(ms.cantitate) AS stoc_calculat,
                AVG(CASE WHEN ms.cantitate > 0 THEN ms.pret_achizitie ELSE NULL END) AS cost_mediu_achizitie,
                AVG(CASE WHEN ms.cantitate < 0 THEN ms.pret_vanzare ELSE NULL END) AS pret_mediu_vanzare
            FROM miscari_stoc ms
            JOIN products p ON ms.id_produs = p.id
            LEFT JOIN gestiuni g ON ms.id_gestiune = g.id_gestiune
            WHERE ms.data_miscare <= ?
        `;
        
        const params = [`${data} 23:59:59`];
        
        if (gestiuneId) {
            query += ` AND ms.id_gestiune = ?`;
            params.push(gestiuneId);
        }
        
        query += `
            GROUP BY ms.id_produs, ms.id_gestiune
            HAVING stoc_calculat != 0
            ORDER BY p.name ASC
        `;
        
        const [rows] = await pool.promise().query(query, params);
        return rows;
    }

    /**
     * Obține evoluția stocului pentru un produs
     */
    async getEvolutieStoc(idProdus, dataStart, dataEnd, gestiuneId = null) {
        let query = `
            SELECT 
                DATE(ms.data_miscare) AS data,
                ms.tip_document,
                ms.cantitate,
                ms.pret_achizitie,
                ms.pret_vanzare,
                SUM(ms.cantitate) OVER (PARTITION BY ms.id_produs ORDER BY ms.data_miscare) AS stoc_parcial
            FROM miscari_stoc ms
            WHERE ms.id_produs = ? 
            AND ms.data_miscare BETWEEN ? AND ?
        `;
        
        const params = [idProdus, `${dataStart} 00:00:00`, `${dataEnd} 23:59:59`];
        
        if (gestiuneId) {
            query += ` AND ms.id_gestiune = ?`;
            params.push(gestiuneId);
        }
        
        query += ` ORDER BY ms.data_miscare ASC`;
        
        const [rows] = await pool.promise().query(query, params);
        return rows;
    }

    /**
     * Adaugă mișcare de stoc din document
     */
    async adaugaMiscareStoc(documentData) {
        const {
            tip_document,
            id_document,
            id_produs,
            id_gestiune,
            cantitate,
            pret_achizitie = 0,
            pret_vanzare = 0,
            data_miscare
        } = documentData;

        const query = `
            INSERT INTO miscari_stoc 
            (tip_document, id_document, id_produs, id_gestiune, cantitate, pret_achizitie, pret_vanzare, data_miscare)
            VALUES (?, ?, ?, ?, ?, ?, ?, ?)
        `;

        await pool.promise().query(query, [
            tip_document,
            id_document,
            id_produs,
            id_gestiune,
            cantitate,
            pret_achizitie,
            pret_vanzare,
            data_miscare
        ]);
    }

    /**
     * Obține stoc curent pentru toate produsele
     */
    async getStocCurent(gestiuneId = null) {
        let query = `
            SELECT 
                vsc.id_produs,
                p.name AS denumire_produs,
                p.barcode,
                p.unit_of_measure,
                vsc.id_gestiune,
                g.denumire_gestiune,
                vsc.stoc_curent,
                vsc.cost_mediu
            FROM view_stoc_curent vsc
            JOIN products p ON vsc.id_produs = p.id
            LEFT JOIN gestiuni g ON vsc.id_gestiune = g.id_gestiune
            WHERE vsc.stoc_curent != 0
        `;

        const params = [];

        if (gestiuneId) {
            query += ` AND vsc.id_gestiune = ?`;
            params.push(gestiuneId);
        }

        query += ` ORDER BY p.name ASC`;

        const [rows] = await pool.promise().query(query, params);
        return rows;
    }
}

module.exports = new StocService();