<?php
/** Integração Mercado Pago — Assinaturas (preapproval). */

require_once __DIR__ . '/config.php';
require_once __DIR__ . '/db.php';

function mp_request(string $metodo, string $caminho, ?array $corpo = null): array {
    $ch = curl_init('https://api.mercadopago.com' . $caminho);
    $headers = [
        'Authorization: Bearer ' . MP_ACCESS_TOKEN,
        'Content-Type: application/json',
    ];
    curl_setopt_array($ch, [
        CURLOPT_RETURNTRANSFER => true,
        CURLOPT_CUSTOMREQUEST => $metodo,
        CURLOPT_HTTPHEADER => $headers,
        CURLOPT_TIMEOUT => 20,
    ]);
    if ($corpo !== null) {
        curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($corpo, JSON_UNESCAPED_UNICODE));
    }
    $resposta = curl_exec($ch);
    $status = curl_getinfo($ch, CURLINFO_RESPONSE_CODE);
    curl_close($ch);
    $dados = json_decode($resposta ?: '{}', true) ?: [];
    $dados['_http'] = $status;
    return $dados;
}

/** Cria a assinatura e devolve [preapproval_id, init_point]. */
function mp_criar_assinatura(array $usuario): array {
    $resp = mp_request('POST', '/preapproval', [
        'reason' => NOME_ASSINATURA,
        'external_reference' => (string) $usuario['id'],
        'payer_email' => $usuario['email'],
        'auto_recurring' => [
            'frequency' => 1,
            'frequency_type' => 'months',
            'transaction_amount' => PRECO_MENSAL,
            'currency_id' => 'BRL',
        ],
        'back_url' => BASE_URL . 'casa#/retorno',
        'status' => 'pending',
    ]);
    if (($resp['_http'] ?? 0) >= 300 || empty($resp['init_point'])) {
        error_log('MP preapproval erro: ' . json_encode($resp));
        return ['erro' => $resp['message'] ?? 'Falha ao criar a assinatura no Mercado Pago.'];
    }
    return ['preapproval_id' => $resp['id'], 'init_point' => $resp['init_point']];
}

/** Consulta o status atual da assinatura no MP e grava no usuário. */
function mp_sincronizar_assinatura(int $usuario_id): ?string {
    $u = usuario_por_id($usuario_id);
    if (!$u || !$u['mp_preapproval_id'] || modo_demo()) {
        return $u['sub_status'] ?? null;
    }
    $resp = mp_request('GET', '/preapproval/' . $u['mp_preapproval_id']);
    if (($resp['_http'] ?? 0) >= 300 || empty($resp['status'])) {
        return $u['sub_status'];
    }
    $status = $resp['status']; // pending | authorized | paused | cancelled
    $st = db()->prepare(
        "UPDATE usuarios SET sub_status = ?, sub_verificada_em = datetime('now') WHERE id = ?"
    );
    $st->execute([$status, $usuario_id]);
    return $status;
}
