<?php
// public/api/account.php
require_once __DIR__ . '/../../app/config.php';
require_once __DIR__ . '/../../app/db.php';
require_once __DIR__ . '/../../app/csrf.php';

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

/** Helper para responder e encerrar */
function jexit(array $payload, int $status = 200): void {
  http_response_code($status);
  echo json_encode($payload);
  exit;
}

/** Inicia sessão (caso ainda não esteja iniciada) */
if (session_status() !== PHP_SESSION_ACTIVE) {
  session_start();
}

/** Autenticação obrigatória */
if (empty($_SESSION['user']['id']) || empty($_SESSION['user']['email'])) {
  jexit(['ok' => false, 'error' => 'Não autenticado'], 401);
}

/** Valida método */
if (($_SERVER['REQUEST_METHOD'] ?? 'GET') !== 'POST') {
  jexit(['ok' => false, 'error' => 'Método não permitido'], 405);
}

/** Valida ação */
$action = $_POST['action'] ?? '';
if ($action !== 'change_password') {
  jexit(['ok' => false, 'error' => 'Ação inválida'], 400);
}

/** CSRF */
$csrf = $_POST['csrf'] ?? '';
if (!csrf_verify($csrf)) {
  jexit(['ok' => false, 'error' => 'Sessão expirada. Recarregue a página.'], 400);
}

/** Campos */
$current = trim((string)($_POST['current_password'] ?? ''));
$new     = trim((string)($_POST['new_password'] ?? ''));
$new2    = trim((string)($_POST['new_password2'] ?? ''));

/** Regras básicas */
if ($current === '' || $new === '' || $new2 === '') {
  jexit(['ok' => false, 'error' => 'Preencha todos os campos.'], 422);
}
if ($new !== $new2) {
  jexit(['ok' => false, 'error' => 'As novas senhas não conferem.'], 422);
}
if (strlen($new) < 8) {
  jexit(['ok' => false, 'error' => 'A nova senha deve ter pelo menos 8 caracteres.'], 422);
}

try {
  $pdo = db();

  // Busca hash atual
  $stmt = $pdo->prepare('
    SELECT id, password_hash
    FROM public.auth_users
    WHERE id = :id
    LIMIT 1
  ');
  $stmt->execute([':id' => $_SESSION['user']['id']]);
  $user = $stmt->fetch();

  if (!$user) {
    jexit(['ok' => false, 'error' => 'Usuário não encontrado.'], 404);
  }

  // Confere senha atual
  if (!password_verify($current, $user['password_hash'])) {
    jexit(['ok' => false, 'error' => 'Senha atual incorreta.'], 403);
  }

  // Evita repetir a mesma senha
  if (password_verify($new, $user['password_hash'])) {
    jexit(['ok' => false, 'error' => 'A nova senha não pode ser igual à atual.'], 422);
  }

  // Gera novo hash
  $newHash = password_hash($new, PASSWORD_DEFAULT);

  // Atualiza (sem tocar no schema)
  $upd = $pdo->prepare('
    UPDATE public.auth_users
    SET password_hash = :h,
        reset_token   = NULL,
        reset_expires = NULL
    WHERE id = :id
  ');
  $upd->execute([
    ':h'  => $newHash,
    ':id' => $user['id'],
  ]);

  jexit(['ok' => true]);
} catch (Throwable $e) {
  // Em dev, você pode expor o erro real definindo APP_DEBUG=true no config
  if (defined('APP_DEBUG') && APP_DEBUG) {
    jexit(['ok' => false, 'error' => $e->getMessage()], 500);
  }
  jexit(['ok' => false, 'error' => 'Erro ao atualizar a senha.'], 500);
}
