<?php
// ============================================
// SEN RDV SANTÉ+ — Patient accepte ou refuse un report
// POST /api/rdv/accepter_report.php
// Headers: Authorization: Bearer {token}
// Body: { "rdv_id": 1, "reponse": "accepter" }
//    ou { "rdv_id": 1, "reponse": "refuser" }
// ============================================

require_once '../config/database.php';
require_once '../config/helpers.php';

if ($_SERVER['REQUEST_METHOD'] !== 'POST') {
    repondre(['erreur' => 'Méthode non autorisée'], 405);
}

// seul le patient concerné peut répondre à un report
$userConnecte = verifierToken();

if ($userConnecte['role'] !== 'patient') {
    repondre(['erreur' => 'Seul le patient peut répondre à une proposition de report'], 403);
}

$body = getBody();
validerChamps($body, ['rdv_id', 'reponse']);

if (!in_array($body['reponse'], ['accepter', 'refuser'])) {
    repondre(['erreur' => 'La réponse doit être accepter ou refuser'], 422);
}

$db = getDB();

// je vérifie que ce RDV appartient bien à ce patient et qu'il y a un report proposé
$stmt = $db->prepare("
    SELECT r.*, s.nom AS service_nom
    FROM rendez_vous r
    JOIN services s ON s.id = r.service_id
    WHERE r.id = ? AND r.patient_id = ?
");
$stmt->execute([$body['rdv_id'], $userConnecte['utilisateur_id']]);
$rdv = $stmt->fetch();

if (!$rdv) {
    repondre(['erreur' => 'Rendez-vous introuvable'], 404);
}

if (empty($rdv['date_proposee']) || empty($rdv['heure_proposee'])) {
    repondre(['erreur' => 'Aucun report proposé pour ce rendez-vous'], 409);
}

// --- CAS 1 : Le patient accepte le nouveau créneau ---
if ($body['reponse'] === 'accepter') {

    // je transfère les nouvelles dates et je remet le RDV en attente de confirmation
    $stmt = $db->prepare("
        UPDATE rendez_vous
        SET date_rdv = date_proposee,
            heure_rdv = heure_proposee,
            date_proposee = NULL,
            heure_proposee = NULL,
            statut = 'en_attente',
            confirme_par = NULL,
            confirme_at = NULL
        WHERE id = ?
    ");
    $stmt->execute([$rdv['id']]);

    repondre([
        'succes'    => true,
        'message'   => 'Nouveau créneau accepté, votre RDV reprend le cycle de confirmation',
        'date_rdv'  => $rdv['date_proposee'],
        'heure_rdv' => $rdv['heure_proposee'],
        'statut'    => 'en_attente'
    ]);
}

// --- CAS 2 : Le patient refuse — annulation sans frais ---
if ($body['reponse'] === 'refuser') {

    $stmt = $db->prepare("
        UPDATE rendez_vous
        SET statut = 'annule', annule_par = 'hopital',
            annule_at = NOW(), raison_annulation = 'Patient a refusé le report proposé'
        WHERE id = ?
    ");
    $stmt->execute([$rdv['id']]);

    // je notifie le gérant que le patient a refusé
    $stmt = $db->prepare("
        INSERT INTO notifications (utilisateur_id, rdv_id, type, canal, message)
        SELECT u.id, ?, 'annulation', 'push',
               CONCAT('Le patient a refusé le report du RDV #', ?)
        FROM utilisateurs u
        WHERE u.service_id = ? AND u.role = 'gerant' AND u.actif = 1
    ");
    $stmt->execute([$rdv['id'], $rdv['id'], $rdv['service_id']]);

    repondre([
        'succes'  => true,
        'message' => 'Report refusé, votre rendez-vous a été annulé sans frais',
        'statut'  => 'annule'
    ]);
}