<?php
/* doc-project | livreur/get_orders.php | Fournit en JSON les commandes de livraison du jour pour le store courant via un mapping de tables mutualisé, avec résolution d’adresse effective (temporaire prioritaire) pour affichage et navigation. | Expose: calculateOrderPayment, buildEffectiveAddressData | Dépend de: livreur/auth_magic.php, livreur/config.php, livreur/lib/store.php, tables POS selon store, pos_pay, pos_temp_adresses | Impacte: réponse API JSON, lecture BDD multi-store, navigation livreur | Tables: pos_commandes*, std_clients, pos_pizzas_commandees*, pos_pizzas, pos_modifs_pizzas*, pos_pay, pos_temp_adresses */
require_once __DIR__ . '/auth_magic.php';
require_driver_auth('json');
header('Content-Type: application/json; charset=utf-8');

date_default_timezone_set('Europe/Paris');
$currentDate = new DateTime();
$currentDate->setTime(0, 0); // Début de la journée

$timestampStartOfDay = $currentDate->getTimestamp() * 1000;
$storeConfig = livreur_store_current_config();
$tables = $storeConfig['tables'];

// Fonction pour calculer les détails de paiement
function calculateOrderPayment(PDO $pdo, array $storeConfig, int $orderId): array {
    $tables = $storeConfig['tables'];
    // Récupérer les pizzas commandées et calculer le total de la commande
    $stmt = $pdo->prepare("
        SELECT ppc.id, ppc.id_pos_pizzas, ppc.is_web_addition, pp.price_large, pp.price_medium
        FROM {$tables['pos_pizzas_commandees']} ppc
        JOIN pos_pizzas pp ON ppc.id_pos_pizzas = pp.id
        WHERE ppc.{$tables['order_fk']} = :orderId
    ");
    $stmt->execute([':orderId' => $orderId]);
    $pizzasCommande = $stmt->fetchAll();

    $totalOrderAmount = 0;

    foreach ($pizzasCommande as $pizza) {
        // Déterminer le prix de base selon la taille
        $basePrice = $pizza['is_web_addition'] ? $pizza['price_medium'] : $pizza['price_large'];
        $totalOrderAmount += $basePrice;

        // Ajouter le prix des options de chaque pizza
        $stmt = $pdo->prepare("
            SELECT data_price
            FROM {$tables['pos_modifs_pizzas']}
            WHERE {$tables['pizza_option_fk']} = :pizzaId
        ");
        $stmt->execute([':pizzaId' => $pizza['id']]);
        $options = $stmt->fetchAll();

        foreach ($options as $option) {
            $totalOrderAmount += $option['data_price'];
        }
    }

    // Récupérer le montant total payé
    $stmt = $pdo->prepare("
        SELECT SUM(vads_amount) AS total_paid
        FROM pos_pay
        WHERE vads_order_id = :orderId
          AND vads_result = '00'
          AND vads_order_info = :orderInfo
    ");
    $stmt->execute([
        ':orderId' => $orderId,
        ':orderInfo' => $storeConfig['payment_order_info'],
    ]);
    $paymentData = $stmt->fetch();
    // Calculer le montant total payé en euros
    $totalPaidAmount = ($paymentData['total_paid'] ?? 0) / 100;

    // Calculer le montant restant dû en euros
    $remainingAmount = $totalOrderAmount - $totalPaidAmount;

    // Déterminer si la commande est payée
    $isPaid = $totalPaidAmount >= $totalOrderAmount;

    return [
        'totalAmount' => $totalOrderAmount,
        'totalPaid' => $totalPaidAmount,
        'remainingAmount' => $remainingAmount,
        'isPaid' => $isPaid
    ];
}

function buildEffectiveAddressData(array $order, ?array $tempAddress, array $storeConfig): array {
    if (is_array($tempAddress) && trim((string)($tempAddress['adresse'] ?? '')) !== '') {
        return [
            'isTemporary' => true,
            'adresse' => (string)($tempAddress['adresse'] ?? ''),
            'complement_adresse' => (string)($tempAddress['complement_adresse'] ?? ''),
            'code_postal' => (string)($tempAddress['code_postal'] ?? $storeConfig['default_postcode']),
            'ville' => (string)($tempAddress['ville'] ?? $storeConfig['default_city']),
            'numero_urgence' => (string)($tempAddress['numero_urgence'] ?? ''),
            'latitude' => (string)($tempAddress['latitude'] ?? ''),
            'longitude' => (string)($tempAddress['longitude'] ?? ''),
            'explications' => (string)($tempAddress['explications'] ?? ''),
        ];
    }

    return [
        'isTemporary' => false,
        'adresse' => (string)($order['adresse'] ?? ''),
        'complement_adresse' => (string)($order['complement_adresse'] ?? ''),
        'code_postal' => (string)($order['code_postal'] ?? $storeConfig['default_postcode']),
        'ville' => (string)($order['ville'] ?? $storeConfig['default_city']),
        'numero_urgence' => '',
        'latitude' => (string)($order['latitude'] ?? ''),
        'longitude' => (string)($order['longitude'] ?? ''),
        'explications' => '',
    ];
}

// Récupérer les commandes du jour
$stmt = $pdo->prepare("SELECT pc.*, sc.nom_prenom, sc.adresse, sc.complement_adresse, sc.phoneNumber, sc.code_postal, sc.ville, sc.num_supp1, sc.num_supp2, sc.latitude, sc.longitude
                       FROM {$tables['pos_commandes']} pc
                       JOIN std_clients sc ON pc.id_client = sc.id
                       WHERE pc.livraison = 1 
                       AND pc.statut != 'deleted'
                       AND pc.heure_prepa >= :timestampStartOfDay
                       ORDER BY pc.heure_prepa ASC");
$stmt->execute([':timestampStartOfDay' => $timestampStartOfDay]);
$orders = $stmt->fetchAll();

$response = [];

foreach ($orders as $order) {
    $orderId = (int)$order['id'];
    // Calculer les détails de paiement de la commande
    $paymentDetails = calculateOrderPayment($pdo, $storeConfig, $orderId);

    // Récupérer les pizzas et leurs modifications/options
    $stmt = $pdo->prepare("SELECT ppc.*, pp.name AS pizza_name, pp.price_large, pp.price_medium
                           FROM {$tables['pos_pizzas_commandees']} ppc
                           JOIN pos_pizzas pp ON ppc.id_pos_pizzas = pp.id
                           WHERE ppc.{$tables['order_fk']} = :orderId");
    $stmt->execute([':orderId' => $orderId]);
    $pizzas = $stmt->fetchAll();

    foreach ($pizzas as $key => $pizza) {
        $stmt = $pdo->prepare("
            SELECT nom_option, class_option, data_price
            FROM {$tables['pos_modifs_pizzas']}
            WHERE {$tables['pizza_option_fk']} = :pizzaId
        ");
        $stmt->execute([':pizzaId' => $pizza['id']]);
        $options = $stmt->fetchAll();
        $pizzas[$key]['options'] = $options;
    }

    // Récupérer les détails de l'adresse temporaire si disponible
    $tempAddress = null;
    $tempAddressId = null;
    if (isset($order['temp_address_id']) && $order['temp_address_id'] !== null) {
        $tempAddressId = $order['temp_address_id'];
    } elseif (isset($order['adresse_temporaire']) && $order['adresse_temporaire'] !== null) {
        $tempAddressId = $order['adresse_temporaire'];
    }

    if ($tempAddressId !== null) {
        $stmt = $pdo->prepare("SELECT * FROM pos_temp_adresses WHERE id = :tempAddressId");
        $stmt->execute([':tempAddressId' => $tempAddressId]);
        $tempAddress = $stmt->fetch();
    }

    $order['tempAddress'] = $tempAddress;
    $effectiveAddress = buildEffectiveAddressData($order, is_array($tempAddress) ? $tempAddress : null, $storeConfig);
    $hasCoordinates = trim((string)$effectiveAddress['latitude']) !== '' && trim((string)$effectiveAddress['longitude']) !== '';
    $order['effectiveAddress'] = $effectiveAddress;

    // Ajouter les détails de la commande, les pizzas, les détails de paiement, et l'adresse temporaire au tableau de réponse
    $response[] = [
        'store' => [
            'code' => $storeConfig['code'],
            'label' => $storeConfig['label'],
            'defaultCity' => $storeConfig['default_city'],
            'defaultPostcode' => $storeConfig['default_postcode'],
        ],
        'order' => $order,
        'pizzas' => $pizzas,
        'paymentDetails' => $paymentDetails,
        'hasCoordinates' => $hasCoordinates,
        'tempAddress' => $tempAddress,
        'effectiveAddress' => $effectiveAddress
    ];
}

echo json_encode($response);
?>
