<?php
/**
 * Mini-projet 01 — Calculatrice PHP
 * API GET : solution.php?op=add&a=5&b=3
 *
 * Démarrage : php -S localhost:8000 (dans le dossier mini-projet/)
 * Test : http://localhost:8000/solution.php?op=add&a=10&b=5
 */

// On envoie toujours du JSON — doit être fait avant toute sortie
header('Content-Type: application/json; charset=utf-8');

// Fonction utilitaire : retourner une erreur JSON et terminer
function erreur(string $message, int $code = 400): never {
    // http_response_code() définit le code de statut HTTP de la réponse
    http_response_code($code);
    // json_encode() transforme un tableau PHP en chaîne JSON
    echo json_encode(['erreur' => $message]);
    exit; // terminer l'exécution — pas de "return" car type never
}

// ── Lecture et validation des paramètres ──────────────────────
// isset() vérifie que la clé existe ET n'est pas null
// Sans cette vérification, $_GET['op'] déclencherait un warning si absent
if (!isset($_GET['op'], $_GET['a'], $_GET['b'])) {
    erreur("Paramètres manquants. Usage : ?op=add&a=5&b=3");
}

$op = $_GET['op'];
// floatval() convertit la chaîne en nombre flottant
// On utilise float (pas int) pour supporter 3.5 + 1.5, etc.
$a  = floatval($_GET['a']);
$b  = floatval($_GET['b']);

// ── Calcul selon l'opération ──────────────────────────────────
// match() est plus strict que switch() : utilise ===, retourne une valeur
// default => erreur(...) gère les opérations inconnues
$resultat = match($op) {
    'add' => $a + $b,
    'sub' => $a - $b,
    'mul' => $a * $b,
    'div' => (function() use ($a, $b) {
        // La division par zéro n'est pas une erreur PHP mais un résultat INF
        // On la détecte et retourne une erreur métier explicite
        if ($b === 0.0) erreur("Division par zéro impossible");
        return $a / $b;
    })(),
    'mod' => $a % (int)$b,  // % ne fonctionne qu'avec des entiers en PHP
    'pow' => $a ** $b,       // opérateur puissance PHP 5.6+
    default => erreur("Opération '$op' inconnue. Ops valides : add, sub, mul, div, mod, pow")
};

// ── Réponse JSON ──────────────────────────────────────────────
// JSON_PRETTY_PRINT formate la sortie pour la lisibilité en dev
echo json_encode([
    'op'     => $op,
    'a'      => $a,
    'b'      => $b,
    'result' => $resultat,
], JSON_PRETTY_PRINT);
