<?php
declare(strict_types=1);

require_once __DIR__ . '/../config/helpers.php';
require_once __DIR__ . '/../config/mercado_pago_helpers.php';

$method = $_SERVER['REQUEST_METHOD'] ?? 'GET';
$data = $method === 'POST' ? input_json() : $_GET;
$idMotorista = (int) ($data['id_motorista'] ?? $data['id_usuario'] ?? 0);

if ($idMotorista <= 0) {
    json_fail('Motorista nao informado.');
}

try {
    $pdo = db();
    $userStmt = $pdo->prepare('SELECT id, nome, email FROM usuarios WHERE id = ? LIMIT 1');
    $userStmt->execute([$idMotorista]);
    $usuario = $userStmt->fetch();
    if (!$usuario) {
        json_fail('Motorista nao encontrado.', 404);
    }

    if ($method !== 'POST') {
        $authorizationUrl = null;
        try {
            $authorizationUrl = mp_oauth_authorization_url($pdo, $idMotorista, 'motorista');
        } catch (Throwable) {
            $authorizationUrl = null;
        }

        json_ok([
            'motorista' => [
                'id' => (int) $usuario['id'],
                'nome' => (string) $usuario['nome'],
                'email' => (string) $usuario['email'],
            ],
            'mercado_pago' => mp_conta_publica(mp_conta_usuario($pdo, $idMotorista, 'motorista')),
            'config' => mp_config($pdo),
            'authorization_url' => $authorizationUrl,
        ]);
    }

    if (!mp_table_exists($pdo, 'mercado_pago_contas')) {
        json_fail('Tabela mercado_pago_contas nao existe. Rode a atualizacao do banco.', 500);
    }

    $mpUserId = trim((string) ($data['mp_user_id'] ?? ''));
    $mpEmail = trim((string) ($data['mp_email'] ?? ''));
    $mpNickname = trim((string) ($data['mp_nickname'] ?? ''));
    $publicKey = trim((string) ($data['public_key'] ?? ''));
    $accessToken = trim((string) ($data['access_token'] ?? ''));
    $refreshToken = trim((string) ($data['refresh_token'] ?? ''));
    $modo = strtolower(trim((string) ($data['modo'] ?? 'sandbox')));
    $status = strtolower(trim((string) ($data['status'] ?? 'conectado')));

    if (!in_array($modo, ['sandbox', 'producao'], true)) {
        $modo = 'sandbox';
    }
    if (!in_array($status, ['pendente', 'conectado', 'desconectado', 'erro'], true)) {
        $status = 'pendente';
    }
    if ($mpUserId === '' && $mpEmail === '' && $accessToken === '') {
        json_fail('Informe ao menos o e-mail, usuario ou token da conta de recebimento.');
    }

    $stmt = $pdo->prepare(
        'INSERT INTO mercado_pago_contas
          (id_usuario, tipo_usuario, mp_user_id, mp_nickname, mp_email, access_token, refresh_token,
           public_key, status, modo, observacao, conectado_em, desconectado_em)
         VALUES (?, "motorista", ?, ?, ?, ?, ?, ?, ?, ?, ?, IF(? = "conectado", NOW(), NULL), IF(? = "desconectado", NOW(), NULL))
         ON DUPLICATE KEY UPDATE
           mp_user_id = VALUES(mp_user_id),
           mp_nickname = VALUES(mp_nickname),
           mp_email = VALUES(mp_email),
           access_token = COALESCE(NULLIF(VALUES(access_token), ""), access_token),
           refresh_token = COALESCE(NULLIF(VALUES(refresh_token), ""), refresh_token),
           public_key = COALESCE(NULLIF(VALUES(public_key), ""), public_key),
           status = VALUES(status),
           modo = VALUES(modo),
           observacao = VALUES(observacao),
           conectado_em = IF(VALUES(status) = "conectado", COALESCE(conectado_em, NOW()), conectado_em),
           desconectado_em = IF(VALUES(status) = "desconectado", NOW(), desconectado_em)'
    );
    $stmt->execute([
        $idMotorista,
        $mpUserId !== '' ? $mpUserId : null,
        $mpNickname !== '' ? $mpNickname : null,
        $mpEmail !== '' ? $mpEmail : null,
        $accessToken !== '' ? $accessToken : null,
        $refreshToken !== '' ? $refreshToken : null,
        $publicKey !== '' ? $publicKey : null,
        $status,
        $modo,
        'Conta registrada para integracao de pagamento. OAuth automatico sera ativado na etapa de producao.',
        $status,
        $status,
    ]);

    json_ok([
        'message' => 'Conta de recebimento registrada.',
        'mercado_pago' => mp_conta_publica(mp_conta_usuario($pdo, $idMotorista, 'motorista')),
    ]);
} catch (Throwable $e) {
    json_fail('Erro ao atualizar conta de recebimento.', 500, ['error' => $e->getMessage()]);
}
