<?php
// doc-project | stats/fill_table_by_date.php | Renseigne ou met à jour quotidiennement les agrégats de commandes par site dans pos_events sur une plage de dates. | Expose: calculateOrderPrice, getOrders, loopThroughDates | Dépend de: config.php, pos_commandes, pos_commandes_pel, pos_pizzas, pos_modifs_pizzas, pos_events | Impacte: BDD, agrégats journaliers, sortie CLI/echo | Tables: pos_commandes(id,heure_prepa,statut), pos_commandes_pel(id,heure_prepa,statut), pos_pizzas(id,price_large,class), pos_modifs_pizzas(id_pos_pizzas_commandes,id_pos_pizzas_commandees,data_price), pos_events(date,montant_total_pelissanne,montant_total_lancon,nombre_pelissanne,nombre_lancon) */
// fill_table.php
// Inclure le fichier de configuration pour accéder à la base de données
include 'config.php';

// Vérifier que la connexion PDO est établie
if (!isset($pdo)) {
    die('Erreur de connexion à la base de données.');
}

// Définir manuellement la plage de dates
$startDate = '2023-07-01';  // Date de début
$endDate = '2023-12-31';    // Date de fin

// Fonction pour calculer le prix d'une commande et compter le nombre de pizzas
function calculateOrderPrice($pdo, $orderId, $suffix) {
    $prixFinalCentimes = 0; // Initialiser le prix total en centimes
    $totalPizzas = 0; // Initialiser le nombre total de pizzas

    // Récupérer les pizzas commandées dans la commande donnée
    $stmt = $pdo->prepare("SELECT ppc.id, ppc.id_pos_pizzas
                           FROM pos_pizzas_commandees{$suffix} ppc
                           WHERE ppc.id_pos_commandes{$suffix} = :orderId");
    $stmt->execute([':orderId' => $orderId]);
    $pizzasCommande = $stmt->fetchAll(PDO::FETCH_ASSOC);

    foreach ($pizzasCommande as $pizza) {
        // Obtenir le prix de base de la pizza en centimes et sa classe
        $stmt = $pdo->prepare("SELECT price_large * 100 as price_large_centimes, class
                               FROM pos_pizzas WHERE id = :pizzaId");
        $stmt->execute([':pizzaId' => $pizza['id_pos_pizzas']]);
        $pizzaDetails = $stmt->fetch(PDO::FETCH_ASSOC);

        $basePriceCentimes = $pizzaDetails['price_large_centimes'] ?? 0;
        $prixFinalCentimes += $basePriceCentimes;

        // Incrémenter le nombre total de pizzas si la classe est 'pizza'
        if ($pizzaDetails['class'] == 'pizza') {
            $totalPizzas += 1;
        }

        // Récupérer et ajouter les prix des options pour cette pizza
        $stmt = $pdo->prepare("SELECT data_price * 100 as data_price_centimes 
                               FROM pos_modifs_pizzas{$suffix} 
                               WHERE id_pos_pizzas_commandees{$suffix} = :pizzaId");
        $stmt->execute([':pizzaId' => $pizza['id']]);
        $options = $stmt->fetchAll(PDO::FETCH_ASSOC);

        foreach ($options as $option) {
            $prixFinalCentimes += $option['data_price_centimes'] ?? 0;
        }
    }

    // Convertir le prix total en euros et arrondir à deux décimales
    $prixFinalEuros = round($prixFinalCentimes / 100, 2);

    return [
        'price' => $prixFinalEuros,
        'pizzas' => $totalPizzas
    ];
}

// Fonction pour récupérer les commandes pour une plage de dates et un suffixe donnés
function getOrders($pdo, $timestampStart, $timestampEnd, $suffix) {
    $stmt = $pdo->prepare("
        SELECT id
        FROM pos_commandes{$suffix}
        WHERE heure_prepa BETWEEN :start AND :end
          AND statut != 'deleted'
    ");
    $stmt->execute([
        ':start' => $timestampStart,
        ':end' => $timestampEnd
    ]);
    $orders = $stmt->fetchAll(PDO::FETCH_ASSOC);
    return $orders;
}

// Fonction pour boucler sur la plage de dates
function loopThroughDates($startDate, $endDate, $pdo) {
    $currentDate = strtotime($startDate);
    $endDate = strtotime($endDate);

    // Boucle sur chaque jour de la plage de dates
    while ($currentDate <= $endDate) {
        // Convertir la date au format 'Y-m-d'
        $date = date('Y-m-d', $currentDate);

        // Obtenir les timestamps de début et de fin pour la date
        $timestampStart = strtotime($date . ' 00:00:00') * 1000; // heure_prepa en millisecondes
        $timestampEnd = strtotime($date . ' 23:59:59') * 1000;

        // Initialiser les totaux pour chaque date
        $totalAmountPelissanne = 0;
        $totalPizzasPelissanne = 0;
        $totalAmountLancon = 0;
        $totalPizzasLancon = 0;

        // Calculer les données pour Pélissanne
        $ordersPelissanne = getOrders($pdo, $timestampStart, $timestampEnd, '_pel');
        foreach ($ordersPelissanne as $order) {
            $orderId = $order['id'];
            $orderData = calculateOrderPrice($pdo, $orderId, '_pel');
            $totalAmountPelissanne += $orderData['price'];
            $totalPizzasPelissanne += $orderData['pizzas'];
        }

        // Calculer les données pour Lançon
        $ordersLancon = getOrders($pdo, $timestampStart, $timestampEnd, '');
        foreach ($ordersLancon as $order) {
            $orderId = $order['id'];
            $orderData = calculateOrderPrice($pdo, $orderId, '');
            $totalAmountLancon += $orderData['price'];
            $totalPizzasLancon += $orderData['pizzas'];
        }

        // Vérifier si les données pour cette date existent déjà dans pos_events
        $stmt = $pdo->prepare("SELECT * FROM pos_events WHERE date = :date");
        $stmt->execute([':date' => $date]);
        $eventData = $stmt->fetch(PDO::FETCH_ASSOC);

        // Insérer ou mettre à jour les données dans pos_events
        if ($eventData) {
            // Mettre à jour
            $stmtUpdate = $pdo->prepare("
                UPDATE pos_events SET
                    montant_total_pelissanne = :montantPelissanne,
                    montant_total_lancon = :montantLancon,
                    nombre_pelissanne = :nombrePelissanne,
                    nombre_lancon = :nombreLancon
                WHERE date = :date
            ");
        } else {
            // Insérer
            $stmtUpdate = $pdo->prepare("
                INSERT INTO pos_events (date, montant_total_pelissanne, montant_total_lancon, nombre_pelissanne, nombre_lancon)
                VALUES (:date, :montantPelissanne, :montantLancon, :nombrePelissanne, :nombreLancon)
            ");
        }

        // Exécuter la requête d'insertion ou de mise à jour
        $stmtUpdate->execute([
            ':date' => $date,
            ':montantPelissanne' => $totalAmountPelissanne,
            ':montantLancon' => $totalAmountLancon,
            ':nombrePelissanne' => $totalPizzasPelissanne,
            ':nombreLancon' => $totalPizzasLancon
        ]);

        // Afficher les données traitées pour chaque date
        echo "Données traitées pour la date : $date\n";

        // Passer au jour suivant
        $currentDate = strtotime('+1 day', $currentDate);
    }
}

// Appel de la fonction pour parcourir la plage de dates
loopThroughDates($startDate, $endDate, $pdo);
?>
