<?php

declare(strict_types=1);

require_once __DIR__ . '/init.php';

header('Content-Type: application/json; charset=utf-8');

function profile_response(bool $success, string $message, int $status = 200): never
{
    http_response_code($status);
    echo json_encode(['success' => $success, 'message' => $message], JSON_UNESCAPED_UNICODE);
    exit;
}

if ($_SERVER['REQUEST_METHOD'] !== 'POST') {
    profile_response(false, 'Método no permitido.', 405);
}
if (!csrf_validate()) {
    profile_response(false, 'La sesión de seguridad venció. Recarga la página.', 419);
}

$userId = (int) ($_SESSION['admin']['uid'] ?? 0);
$name = trim((string) ($_POST['nombre_usuario'] ?? ''));
$phone = trim((string) ($_POST['telefono'] ?? ''));
$password = (string) ($_POST['clave'] ?? '');

if ($userId <= 0 || $name === '') {
    profile_response(false, 'La sesión o el nombre de usuario no son válidos.', 422);
}
if (mb_strlen($name, 'UTF-8') > 100 || mb_strlen($phone, 'UTF-8') > 20) {
    profile_response(false, 'El nombre o teléfono supera el tamaño permitido.', 422);
}
if ($password !== '' && (strlen($password) < 8 || !preg_match('/[A-Za-z]/', $password) || !preg_match('/\d/', $password))) {
    profile_response(false, 'La contraseña debe tener al menos 8 caracteres, con letras y números.', 422);
}

try {
    $fields = ['nombre_usuario = ?', 'telefono = ?'];
    $params = [$name, $phone !== '' ? $phone : null];
    if ($password !== '') {
        $fields[] = 'clave = ?';
        $params[] = password_hash($password, PASSWORD_DEFAULT);
    }
    $params[] = $userId;
    $stmt = $pdo->prepare('UPDATE usuarios SET ' . implode(', ', $fields) . ' WHERE id = ?');
    $stmt->execute($params);

    $_SESSION['admin']['nombre_usuario'] = $name;
    $_SESSION['admin']['telefono'] = $phone;
    profile_response(true, 'Tus datos fueron actualizados correctamente.');
} catch (Throwable $e) {
    error_log('Error al actualizar perfil: ' . $e->getMessage());
    profile_response(false, 'No se pudieron actualizar tus datos.', 500);
}
