// allo stesso modo di t_web_articolifatturati.js 
// creami il modello t_web_ordini:

// Tabella: T_WEB_Ordini
/*Codice - decimal ()
IdInternet - varchar (50)
CodArticoloGM - varchar (50)
Qta - decimal ()
PrezzoLordo - decimal ()
PercSconto - decimal ()
Enabled - int ()
DataOra - datetime ()
SovraSconto - decimal ()
Descrizione - varchar (250)
PrimaCopiaDaSpedire - int ()

*/

const mongoose = require('mongoose');

const Product = require('./product');

// Definizione dello schema
const ordiniSchema = new mongoose.Schema({
  Codice: {
    type: Number, // Decimal in MongoDB è rappresentato come Number
  },
  IdInternet: {
    type: String,
    maxlength: 50,
  },
  CodArticoloGM: {
    type: String,
    maxlength: 50,
  },
  Qta: {
    type: Number, // Decimal in MongoDB è rappresentato come Number
  },
  PrezzoLordo: {
    type: Number, // Decimal in MongoDB è rappresentato come Number
  },
  PercSconto: {
    type: Number, // Decimal in MongoDB è rappresentato come Number
  },
  Enabled: {
    type: Number, // Int in MongoDB è rappresentato come Number
  },
  DataOra: {
    type: Date, // Datetime in MongoDB è rappresentato come Date
  },
  SovraSconto: {
    type: Number, // Decimal in MongoDB è rappresentato come Number
  },
  Descrizione: {
    type: String,
    maxlength: 250
  },
  PrimaCopiaDaSpedire: {
    type: Number, // Int in MongoDB è rappresentato come Number
  }
}, {
  timestamps: true, // Aggiunge automaticamente i campi createdAt e updatedAt
  collection: 't_web_ordinis',
});

var T_WEB_Ordini = module.exports = mongoose.model('T_WEB_Ordini', ordiniSchema);

module.exports.updateStatisticsOrders = async function (CodArticoloGM, idapp, update) {
  const currentDate = new Date();

  // Calcola le date limite per i periodi di 3 mesi, 6 mesi e 1 anno
  const threeMonthsAgo = new Date(currentDate);
  threeMonthsAgo.setMonth(currentDate.getMonth() - 3);

  const sixMonthsAgo = new Date(currentDate);
  sixMonthsAgo.setMonth(currentDate.getMonth() - 6);

  const oneYearAgo = new Date(currentDate);
  oneYearAgo.setFullYear(currentDate.getFullYear() - 1);

  const twoYearAgo = new Date(currentDate);
  twoYearAgo.setFullYear(currentDate.getFullYear() - 2);

  const fiveYear = new Date(currentDate);
  fiveYear.setFullYear(currentDate.getFullYear() - 5);

  try {
    let myquery = [];

    if (CodArticoloGM) {
      // Query di aggregazione per calcolare le statistiche
      myquery.push(
        {
          $match: {
            CodArticoloGM: CodArticoloGM,
          },
        });
    }
    
    myquery.push(
      {
        $group: {
          _id: "$CodArticoloGM", // Raggruppa per CodArticolo
          totVen: {
            $sum: {
              $cond: [
                { $gte: ["$DataOra", fiveYear] }, // Condizione: DataOra totale
                { $toInt: "$Qta" }, // Se vero, somma la quantità
                0 // Altrimenti, somma 0
              ]
            }
          },
          vLast3M: {
            $sum: {
              $cond: [
                { $gte: ["$DataOra", threeMonthsAgo] }, // Condizione: DataOra >= 3 mesi fa
                { $toInt: "$Qta" }, // Se vero, somma la quantità
                0 // Altrimenti, somma 0
              ]
            }
          },
          vLast6M: {
            $sum: {
              $cond: [
                { $gte: ["$DataOra", sixMonthsAgo] }, // Condizione: DataOra >= 6 mesi fa
                { $toInt: "$Qta" }, // Se vero, somma la quantità
                0 // Altrimenti, somma 0
              ]
            }
          },
          vLast1Y: {
            $sum: {
              $cond: [
                { $gte: ["$DataOra", oneYearAgo] }, // Condizione: DataOra >= 1 anno fa
                { $toInt: "$Qta" }, // Se vero, somma la quantità
                0 // Altrimenti, somma 0
              ]
            }
          },
          vLast2Y: {
            $sum: {
              $cond: [
                { $gte: ["$DataOra", twoYearAgo] }, // Condizione: DataOra >= 1 anno fa
                { $toInt: "$Qta" }, // Se vero, somma la quantità
                0 // Altrimenti, somma 0
              ]
            }
          },
        }
      },
      {
        $project: {
          _id: 0, // Rimuove il campo _id dal risultato
          sku: "$_id", // Rinomina _id in sku (equivalente a IdArticolo)
          totVen: 1,
          vLast3M: 1,
          vLast6M: 1,
          vLast1Y: 1,
          vLast2Y: 1,
        }
      }
    );

    const statistics = await T_WEB_Ordini.aggregate(myquery);

    let countUpdate = 0;

    if (update) {
      for (const stat of statistics) {

        const result = await Product.updateOne(
          {
            'productInfo.sku': stat.sku,
            idapp,
          }, // Cerca il documento con lo stesso sku
          {
            $set: {
              'productInfo.totVen': stat.totVen,
              'productInfo.vLast3M': stat.vLast3M,
              'productInfo.vLast6M': stat.vLast6M,
              'productInfo.vLast1Y': stat.vLast1Y,
              'productInfo.vLast2Y': stat.vLast2Y,
            }
          },
          { upsert: false } // Non crea il documento se non esiste
        );
        if (result.modifiedCount > 0) {
          countUpdate++;
        }
      }
    }

    return countUpdate;
  } catch (error) {
    console.error("Errore durante il calcolo delle statistiche:", error);
    return 0;
  }
}


