<?php
// ─── API GROUP DAILY ──────────────────────────────────────────────────────────
// Routes :
//   GET  /api/group_daily.php?action=question&group_id=X  → question du jour
//   POST /api/group_daily.php?action=answer               → soumettre réponse
//   GET  /api/group_daily.php?action=feed&group_id=X      → réponses du groupe (si déjà répondu)
//   GET  /api/group_daily.php?action=poll&group_id=X&since=TS → long polling feed

header('Content-Type: application/json; charset=utf-8');
header('Access-Control-Allow-Origin: *');
header('Access-Control-Allow-Methods: GET, POST, OPTIONS');
header('Access-Control-Allow-Headers: Content-Type, Authorization');

if ($_SERVER['REQUEST_METHOD'] === 'OPTIONS') { http_response_code(204); exit; }

require 'db.php';
require 'jwt_helper.php';

$action = $_GET['action'] ?? '';
$method = $_SERVER['REQUEST_METHOD'];
$body   = json_decode(file_get_contents('php://input'), true) ?? [];

// ─── Calcul du jour (nb jours depuis 2025-01-01) ─────────────────────────────
function getDayNumber() {
    $ref = new DateTime('2025-01-01');
    $now = new DateTime();
    return (int)$now->diff($ref)->days;
}

// ─── Questions culture générale (piochées dans QUIZ_DATA côté serveur) ────────
// On stocke un sous-ensemble de questions culture g ici pour le tirage serveur.
// Le front envoie aussi les questions au moment de create_challenge,
// mais pour le daily on tire côté serveur pour garantir l'unicité par groupe/jour.
function getCultureGQuestions() {
    // Pool de questions culture générale — mix science, géopo, histoire
    // Format identique à QUIZ_DATA dans script.js
    return [
        ["question"=>"Quelle est la capitale de l'Australie ?","options"=>["Sydney","Melbourne","Canberra","Brisbane"],"answer"=>"Canberra","explanation"=>"Canberra est la capitale fédérale de l'Australie depuis 1913."],
        ["question"=>"Quel est l'élément chimique de symbole 'Au' ?","options"=>["Argent","Or","Aluminium","Azote"],"answer"=>"Or","explanation"=>"Au vient du latin 'Aurum', qui signifie or."],
        ["question"=>"En quelle année a eu lieu la Révolution française ?","options"=>["1789","1776","1804","1815"],"answer"=>"1789","explanation"=>"La Révolution française a débuté en 1789 avec la prise de la Bastille le 14 juillet."],
        ["question"=>"Quel pays est le plus grand du monde par sa superficie ?","options"=>["Canada","Chine","États-Unis","Russie"],"answer"=>"Russie","explanation"=>"La Russie couvre 17,1 millions de km², soit environ 11% des terres émergées."],
        ["question"=>"Combien de côtés a un hexagone ?","options"=>["5","6","7","8"],"answer"=>"6","explanation"=>"Un hexagone est un polygone à 6 côtés. Le rayon en est l'exemple le plus courant dans la nature."],
        ["question"=>"Qui a peint la Joconde ?","options"=>["Michel-Ange","Raphaël","Léonard de Vinci","Botticelli"],"answer"=>"Léonard de Vinci","explanation"=>"La Joconde (Mona Lisa) a été peinte par Léonard de Vinci entre 1503 et 1519."],
        ["question"=>"Quelle planète est la plus proche du Soleil ?","options"=>["Vénus","Mars","Mercure","Terre"],"answer"=>"Mercure","explanation"=>"Mercure est la planète la plus proche du Soleil, à environ 57,9 millions de km en moyenne."],
        ["question"=>"Quel est le plus long fleuve du monde ?","options"=>["Amazone","Nil","Mississippi","Yangtsé"],"answer"=>"Nil","explanation"=>"Le Nil mesure environ 6 650 km. L'Amazone est parfois cité en raison de son débit exceptionnel."],
        ["question"=>"En quelle année l'homme a-t-il marché sur la Lune pour la première fois ?","options"=>["1965","1967","1969","1972"],"answer"=>"1969","explanation"=>"Neil Armstrong a posé le pied sur la Lune le 21 juillet 1969, lors de la mission Apollo 11."],
        ["question"=>"Quelle est la monnaie officielle du Japon ?","options"=>["Won","Yuan","Yen","Ringgit"],"answer"=>"Yen","explanation"=>"Le yen (¥) est la monnaie officielle du Japon depuis 1871."],
        ["question"=>"Quel organe produit l'insuline ?","options"=>["Le foie","Le pancréas","Les reins","L'estomac"],"answer"=>"Le pancréas","explanation"=>"Le pancréas produit l'insuline, hormone qui régule le taux de glucose dans le sang."],
        ["question"=>"Quelle est la vitesse du son dans l'air (environ) ?","options"=>["300 km/h","1 200 km/h","343 m/s","1 500 m/s"],"answer"=>"343 m/s","explanation"=>"La vitesse du son dans l'air à 20°C est d'environ 343 m/s, soit 1 235 km/h."],
        ["question"=>"Combien d'os compte le corps humain adulte ?","options"=>["186","206","226","246"],"answer"=>"206","explanation"=>"Un adulte possède 206 os. Les nourrissons en ont environ 270, certains fusionnant en grandissant."],
        ["question"=>"Quelle est la capitale du Brésil ?","options"=>["Rio de Janeiro","São Paulo","Brasilia","Salvador"],"answer"=>"Brasilia","explanation"=>"Brasilia est la capitale du Brésil depuis 1960, construite de toutes pièces pour remplacer Rio."],
        ["question"=>"Qui a écrit 'Les Misérables' ?","options"=>["Balzac","Flaubert","Victor Hugo","Zola"],"answer"=>"Victor Hugo","explanation"=>"Les Misérables a été publié par Victor Hugo en 1862, c'est l'un des romans les plus lus au monde."],
        ["question"=>"Quel est le symbole chimique de l'eau ?","options"=>["O2","HO","H2O","H3O"],"answer"=>"H2O","explanation"=>"L'eau est une molécule composée de 2 atomes d'hydrogène et 1 atome d'oxygène."],
        ["question"=>"Dans quel pays se trouve le Machu Picchu ?","options"=>["Bolivie","Colombie","Pérou","Chili"],"answer"=>"Pérou","explanation"=>"Le Machu Picchu est un site inca situé dans les Andes péruviennes, à 2 430 m d'altitude."],
        ["question"=>"Quelle est la plus haute montagne du monde ?","options"=>["K2","Mont Blanc","Kilimandjaro","Everest"],"answer"=>"Everest","explanation"=>"L'Everest culmine à 8 849 m dans l'Himalaya, à la frontière du Népal et de la Chine."],
        ["question"=>"Combien de joueurs compte une équipe de football sur le terrain ?","options"=>["9","10","11","12"],"answer"=>"11","explanation"=>"Chaque équipe de football joue avec 11 joueurs, dont un gardien de but."],
        ["question"=>"Quelle est la langue la plus parlée dans le monde ?","options"=>["Anglais","Espagnol","Mandarin","Hindi"],"answer"=>"Mandarin","explanation"=>"Le mandarin est la langue maternelle de plus d'un milliard de personnes, principalement en Chine."],
        ["question"=>"Quel scientifique a formulé la loi de la gravitation universelle ?","options"=>["Galilée","Einstein","Newton","Kepler"],"answer"=>"Newton","explanation"=>"Isaac Newton a formulé la loi de la gravitation universelle en 1687 dans ses Principia Mathematica."],
        ["question"=>"Quelle est la capitale de l'Espagne ?","options"=>["Barcelone","Séville","Valence","Madrid"],"answer"=>"Madrid","explanation"=>"Madrid est la capitale de l'Espagne et sa ville la plus peuplée, avec environ 3,3 millions d'habitants."],
        ["question"=>"Quel est le continent le plus grand du monde ?","options"=>["Afrique","Amérique","Europe","Asie"],"answer"=>"Asie","explanation"=>"L'Asie est le plus grand continent avec 44,5 millions de km² et représente 30% des terres émergées."],
        ["question"=>"En combien de jours la Terre tourne-t-elle autour du Soleil ?","options"=>["265","355","365","375"],"answer"=>"365","explanation"=>"La Terre met environ 365,25 jours pour faire le tour du Soleil, d'où l'année bissextile tous les 4 ans."],
        ["question"=>"Qui a inventé le téléphone ?","options"=>["Edison","Bell","Tesla","Marconi"],"answer"=>"Bell","explanation"=>"Alexander Graham Bell a déposé le brevet du téléphone en 1876, bien que la paternité soit parfois disputée."],
        ["question"=>"Quelle est la capitale de l'Italie ?","options"=>["Milan","Naples","Florence","Rome"],"answer"=>"Rome","explanation"=>"Rome est la capitale de l'Italie et l'une des plus anciennes villes du monde, surnommée la Ville Éternelle."],
        ["question"=>"Quel est le plus petit pays du monde ?","options"=>["Monaco","Saint-Marin","Liechtenstein","Vatican"],"answer"=>"Vatican","explanation"=>"Le Vatican couvre 0,44 km², ce qui en fait le plus petit État souverain du monde."],
        ["question"=>"Quel métal est liquide à température ambiante ?","options"=>["Plomb","Étain","Mercure","Gallium"],"answer"=>"Mercure","explanation"=>"Le mercure (Hg) est le seul métal liquide à température ambiante, avec un point de fusion à -38,8°C."],
        ["question"=>"Combien de continents compte la Terre ?","options"=>["5","6","7","8"],"answer"=>"7","explanation"=>"Les 7 continents sont : Afrique, Antarctique, Asie, Australie/Océanie, Europe, Amérique du Nord, Amérique du Sud."],
        ["question"=>"Quel est le plus grand océan du monde ?","options"=>["Atlantique","Indien","Arctique","Pacifique"],"answer"=>"Pacifique","explanation"=>"L'océan Pacifique couvre 165 millions de km², soit plus que toutes les terres émergées réunies."],
        ["question"=>"Dans quelle ville se trouve la Tour Eiffel ?","options"=>["Lyon","Marseille","Paris","Bordeaux"],"answer"=>"Paris","explanation"=>"La Tour Eiffel a été construite à Paris par Gustave Eiffel pour l'Exposition universelle de 1889."],
        ["question"=>"Quel est l'os le plus long du corps humain ?","options"=>["L'humérus","Le tibia","Le fémur","La colonne vertébrale"],"answer"=>"Le fémur","explanation"=>"Le fémur, os de la cuisse, est l'os le plus long et le plus solide du corps humain."],
        ["question"=>"Combien de grammes font un kilogramme ?","options"=>["10","100","1000","10000"],"answer"=>"1000","explanation"=>"Un kilogramme vaut 1 000 grammes. Le préfixe 'kilo' signifie mille en grec."],
        ["question"=>"Quel pays a remporté la Coupe du Monde de football 2018 ?","options"=>["Brésil","Allemagne","France","Argentine"],"answer"=>"France","explanation"=>"La France a remporté la Coupe du Monde 2018 en Russie, en battant la Croatie 4-2 en finale."],
        ["question"=>"Quelle est la couleur obtenue en mélangeant bleu et jaune ?","options"=>["Orange","Violet","Vert","Marron"],"answer"=>"Vert","explanation"=>"Le mélange de bleu et de jaune donne du vert, une règle de base de la synthèse soustractive des couleurs."],
        ["question"=>"Qui était le premier président des États-Unis ?","options"=>["Abraham Lincoln","Thomas Jefferson","Benjamin Franklin","George Washington"],"answer"=>"George Washington","explanation"=>"George Washington fut le premier président des États-Unis, de 1789 à 1797."],
        ["question"=>"Quel est le symbole chimique du fer ?","options"=>["Fe","Fr","Fi","Fo"],"answer"=>"Fe","explanation"=>"Le symbole Fe vient du latin 'Ferrum'. Le fer est l'un des métaux les plus répandus sur Terre."],
        ["question"=>"Dans quel pays se trouve la Grande Muraille ?","options"=>["Japon","Inde","Corée","Chine"],"answer"=>"Chine","explanation"=>"La Grande Muraille de Chine s'étend sur plus de 21 000 km à travers le nord de la Chine."],
        ["question"=>"Combien de secondes y a-t-il dans une minute ?","options"=>["30","60","90","120"],"answer"=>"60","explanation"=>"Une minute contient 60 secondes, une convention héritée du système sexagésimal babylonien."],
        ["question"=>"Quel écrivain a créé le personnage de Sherlock Holmes ?","options"=>["Agatha Christie","Edgar Allan Poe","Arthur Conan Doyle","G.K. Chesterton"],"answer"=>"Arthur Conan Doyle","explanation"=>"Arthur Conan Doyle a créé Sherlock Holmes en 1887 dans 'Une étude en rouge'."],
        ["question"=>"Quel est le plus grand désert du monde ?","options"=>["Sahara","Gobi","Antarctique","Arabie"],"answer"=>"Antarctique","explanation"=>"L'Antarctique est le plus grand désert du monde (14 millions de km²). Le Sahara est le plus grand désert chaud."],
        ["question"=>"Quelle est la capitale de l'Allemagne ?","options"=>["Munich","Hambourg","Francfort","Berlin"],"answer"=>"Berlin","explanation"=>"Berlin est la capitale et la plus grande ville d'Allemagne, avec environ 3,7 millions d'habitants."],
        ["question"=>"En quelle année Christophe Colomb a-t-il découvert l'Amérique ?","options"=>["1488","1492","1498","1502"],"answer"=>"1492","explanation"=>"Christophe Colomb a atteint les Amériques le 12 octobre 1492, en abordant une île des Bahamas."],
        ["question"=>"Quel est le plus grand pays d'Afrique par superficie ?","options"=>["Congo","Soudan","Nigeria","Algérie"],"answer"=>"Algérie","explanation"=>"L'Algérie est le plus grand pays d'Afrique avec 2,38 millions de km², depuis la partition du Soudan en 2011."],
        ["question"=>"Quelle est la formule chimique du sel de table ?","options"=>["KCl","NaCl","CaCl2","MgCl2"],"answer"=>"NaCl","explanation"=>"Le sel de table est du chlorure de sodium (NaCl), composé d'un ion sodium et d'un ion chlorure."],
        ["question"=>"Combien de jours compte le mois de février lors d'une année bissextile ?","options"=>["27","28","29","30"],"answer"=>"29","explanation"=>"Lors d'une année bissextile (tous les 4 ans), février compte 29 jours au lieu de 28."],
        ["question"=>"Quel animal est le plus rapide sur terre ?","options"=>["Lion","Guépard","Antilope","Faucon"],"answer"=>"Guépard","explanation"=>"Le guépard peut atteindre 110 km/h sur de courtes distances, ce qui en fait l'animal terrestre le plus rapide."],
        ["question"=>"Dans quelle ville se trouve le Colisée ?","options"=>["Athènes","Florence","Naples","Rome"],"answer"=>"Rome","explanation"=>"Le Colisée est un amphithéâtre antique situé au cœur de Rome, construit entre 70 et 80 après J.-C."],
        ["question"=>"Quel est le symbole chimique de l'oxygène ?","options"=>["Ox","O","Og","Om"],"answer"=>"O","explanation"=>"L'oxygène a pour symbole O (numéro atomique 8). Il constitue 21% de l'atmosphère terrestre."],
        ["question"=>"Qui a composé la Cinquième Symphonie ?","options"=>["Mozart","Bach","Beethoven","Schubert"],"answer"=>"Beethoven","explanation"=>"La Cinquième Symphonie de Beethoven (1808) est l'une des œuvres musicales les plus célèbres au monde."],
    ];
}

// ─── Tire la question du jour pour un groupe ──────────────────────────────────
// Déterministe : même groupe + même jour = même question
function getDailyQuestion($groupId, $day) {
    $questions = getCultureGQuestions();
    $idx = ($groupId * 31 + $day * 7) % count($questions);
    return $questions[$idx];
}

// ─── GET question ─────────────────────────────────────────────────────────────
if ($action === 'question' && $method === 'GET') {
    $userId  = requireAuth();
    $groupId = (int)($_GET['group_id'] ?? 0);

    if (!$groupId) { http_response_code(400); echo json_encode(['message' => 'group_id requis']); exit; }

    // Vérif membre
    $stmt = $pdo->prepare("SELECT 1 FROM group_members WHERE group_id = ? AND user_id = ?");
    $stmt->execute([$groupId, $userId]);
    if (!$stmt->fetch()) { http_response_code(403); echo json_encode(['message' => 'Accès refusé']); exit; }

    $day      = getDayNumber();
    $question = getDailyQuestion($groupId, $day);

    // Est-ce que j'ai déjà répondu ?
    $stmt = $pdo->prepare("SELECT answer, correct FROM group_daily_answers WHERE group_id = ? AND user_id = ? AND day = ?");
    $stmt->execute([$groupId, $userId, $day]);
    $myAnswer = $stmt->fetch() ?: null;

    // Nombre de membres
    $stmt = $pdo->prepare("SELECT COUNT(*) AS cnt FROM group_members WHERE group_id = ?");
    $stmt->execute([$groupId]);
    $memberCount = (int)$stmt->fetch()['cnt'];

    // Nombre de réponses aujourd'hui
    $stmt = $pdo->prepare("SELECT COUNT(*) AS cnt FROM group_daily_answers WHERE group_id = ? AND day = ?");
    $stmt->execute([$groupId, $day]);
    $answeredCount = (int)$stmt->fetch()['cnt'];

    // Si j'ai répondu → on retourne aussi le feed
    $feed = [];
    if ($myAnswer) {
        $stmt = $pdo->prepare("SELECT u.username, gda.answer, gda.correct, gda.answered_at FROM group_daily_answers gda JOIN users u ON u.id = gda.user_id WHERE gda.group_id = ? AND gda.day = ? ORDER BY gda.answered_at ASC");
        $stmt->execute([$groupId, $day]);
        $feed = $stmt->fetchAll();
    }

    echo json_encode([
        'day'            => $day,
        'question'       => $question,
        'my_answer'      => $myAnswer,
        'answered_count' => $answeredCount,
        'member_count'   => $memberCount,
        'feed'           => $feed
    ]);
    exit;
}

// ─── POST answer ──────────────────────────────────────────────────────────────
if ($action === 'answer' && $method === 'POST') {
    $userId  = requireAuth();
    $groupId = (int)($body['group_id'] ?? 0);
    $answer  = trim($body['answer']   ?? '');

    if (!$groupId || !$answer) {
        http_response_code(400);
        echo json_encode(['message' => 'group_id et answer requis']);
        exit;
    }

    // Vérif membre
    $stmt = $pdo->prepare("SELECT 1 FROM group_members WHERE group_id = ? AND user_id = ?");
    $stmt->execute([$groupId, $userId]);
    if (!$stmt->fetch()) { http_response_code(403); echo json_encode(['message' => 'Accès refusé']); exit; }

    $day      = getDayNumber();
    $question = getDailyQuestion($groupId, $day);

    // Déjà répondu ?
    $stmt = $pdo->prepare("SELECT 1 FROM group_daily_answers WHERE group_id = ? AND user_id = ? AND day = ?");
    $stmt->execute([$groupId, $userId, $day]);
    if ($stmt->fetch()) {
        http_response_code(409);
        echo json_encode(['message' => 'Tu as déjà répondu aujourd\'hui']);
        exit;
    }

    // Vérifie si correct
    $correct = (strtolower(trim($answer)) === strtolower(trim($question['answer']))) ? 1 : 0;

    $pdo->prepare("INSERT INTO group_daily_answers (group_id, user_id, day, answer, correct) VALUES (?, ?, ?, ?, ?)")
        ->execute([$groupId, $userId, $day, $answer, $correct]);

    // Retourne le feed complet
    $stmt = $pdo->prepare("SELECT u.username, gda.answer, gda.correct, gda.answered_at FROM group_daily_answers gda JOIN users u ON u.id = gda.user_id WHERE gda.group_id = ? AND gda.day = ? ORDER BY gda.answered_at ASC");
    $stmt->execute([$groupId, $day]);
    $feed = $stmt->fetchAll();

    echo json_encode([
        'correct'        => (bool)$correct,
        'correct_answer' => $question['answer'],
        'explanation'    => $question['explanation'],
        'feed'           => $feed
    ]);
    exit;
}

// ─── GET feed (avec long polling) ─────────────────────────────────────────────
// Retourne le feed si l'utilisateur a répondu.
// `since` = timestamp UNIX de la dernière réponse connue — attend jusqu'à 20s
// qu'une nouvelle réponse arrive avant de retourner.
if ($action === 'poll' && $method === 'GET') {
    $userId  = requireAuth();
    $groupId = (int)($_GET['group_id'] ?? 0);
    $since   = $_GET['since'] ?? '';

    if (!$groupId) { http_response_code(400); echo json_encode(['message' => 'group_id requis']); exit; }

    // Vérif membre
    $stmt = $pdo->prepare("SELECT 1 FROM group_members WHERE group_id = ? AND user_id = ?");
    $stmt->execute([$groupId, $userId]);
    if (!$stmt->fetch()) { http_response_code(403); echo json_encode(['message' => 'Accès refusé']); exit; }

    $day = getDayNumber();

    // L'utilisateur doit avoir répondu pour voir le feed
    $stmt = $pdo->prepare("SELECT 1 FROM group_daily_answers WHERE group_id = ? AND user_id = ? AND day = ?");
    $stmt->execute([$groupId, $userId, $day]);
    if (!$stmt->fetch()) {
        echo json_encode(['feed' => [], 'waiting' => true]);
        exit;
    }

    // Long polling : attend jusqu'à 20s qu'une nouvelle réponse arrive
    $maxWait  = 20;
    $interval = 2;
    $waited   = 0;
    $sinceTs  = $since ? date('Y-m-d H:i:s', (int)$since) : '2000-01-01 00:00:00';

    while ($waited < $maxWait) {
        $stmt = $pdo->prepare("SELECT u.username, gda.answer, gda.correct, gda.answered_at FROM group_daily_answers gda JOIN users u ON u.id = gda.user_id WHERE gda.group_id = ? AND gda.day = ? ORDER BY gda.answered_at ASC");
        $stmt->execute([$groupId, $day]);
        $feed = $stmt->fetchAll();

        // Y a-t-il une réponse plus récente que `since` ?
        $hasNew = false;
        foreach ($feed as $f) {
            if ($f['answered_at'] > $sinceTs) { $hasNew = true; break; }
        }

        if ($hasNew || !$since) {
            echo json_encode(['feed' => $feed, 'waiting' => false]);
            exit;
        }

        sleep($interval);
        $waited += $interval;
    }

    // Timeout — retourne quand même le feed actuel
    $stmt = $pdo->prepare("SELECT u.username, gda.answer, gda.correct, gda.answered_at FROM group_daily_answers gda JOIN users u ON u.id = gda.user_id WHERE gda.group_id = ? AND gda.day = ? ORDER BY gda.answered_at ASC");
    $stmt->execute([$groupId, $day]);
    $feed = $stmt->fetchAll();
    echo json_encode(['feed' => $feed, 'waiting' => false]);
    exit;
}

http_response_code(404);
echo json_encode(['message' => 'Action inconnue']);
