<?php
// /views/actualizar_estado_agenda.php
declare(strict_types=1);

// Forzamos JSON y prevenimos que se mezcle HTML/errores con la respuesta
ini_set('display_errors', '0');
ini_set('html_errors', '0');
header('Content-Type: application/json; charset=utf-8');

// Capturamos cualquier “ruido” accidental (warnings, espacios, BOM de includes, etc.)
ob_start();

session_start();
$response = ['success' => false, 'message' => 'Error del servidor'];

if (empty($_SESSION['user_id'])) {
  // limpiamos cualquier salida previa y devolvemos JSON puro
  ob_end_clean();
  echo json_encode(['success'=>false,'message'=>'No autorizado'], JSON_UNESCAPED_UNICODE);
  exit;
}

require_once '../services/pdo_connection.php';

try {
  $id     = isset($_POST['id_agenda']) ? (int)$_POST['id_agenda'] : 0;
  $estado = $_POST['estado'] ?? '';
  $fecha  = trim($_POST['fecha'] ?? '');

  if ($id <= 0) {
    throw new RuntimeException('ID inválido');
  }

  $permitidos = ['RESERVADO','COMPLETADO','CANCELADO'];
  if ($estado !== '' && !in_array($estado, $permitidos, true)) {
    throw new RuntimeException('Estado inválido');
  }

  // Normaliza fecha (acepta DD/MM/YYYY o YYYY-MM-DD)
  if ($fecha !== '') {
    if (preg_match('#^\d{2}/\d{2}/\d{4}$#', $fecha)) {
      [$d,$m,$y] = explode('/',$fecha);
      $fecha = sprintf('%04d-%02d-%02d', (int)$y, (int)$m, (int)$d);
    }
    if (!preg_match('#^\d{4}-\d{2}-\d{2}$#', $fecha)) {
      throw new RuntimeException('Fecha inválida');
    }
  }

  $db = (new Database())->getConnection();
  $db->beginTransaction();

  if ($estado !== '') {
    $st = $db->prepare('UPDATE agenda SET estado = :estado WHERE id_agenda = :id');
    $st->execute([':estado'=>$estado, ':id'=>$id]);
  }
  if ($fecha !== '') {
    $st = $db->prepare('UPDATE agenda SET fecha_evento = :f WHERE id_agenda = :id');
    $st->execute([':f'=>$fecha, ':id'=>$id]);
  }

  $db->commit();
  $response = ['success'=>true, 'message'=>'Actualizado correctamente'];
} catch (Throwable $e) {
  if (isset($db) && $db->inTransaction()) $db->rollBack();
  // Log interno para que puedas ver el motivo real sin romper el JSON
  error_log('actualizar_estado_agenda: '.$e->getMessage());
}

// Descarta cualquier “ruido” capturado y solo envía JSON
$noise = ob_get_clean();
if ($noise !== '') {
  // Lo registramos para depurar, pero no lo mandamos al cliente
  error_log("Noise actualizar_estado_agenda: ".$noise);
}

echo json_encode($response, JSON_UNESCAPED_UNICODE);
exit;
