/**
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you under the Apache License, Version 2.0 (the
 * "License"); you may not use this file except in compliance
 * with the License.  You may obtain a copy of the License at
 *
 *   http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing,
 * software distributed under the License is distributed on an
 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 * KIND, either express or implied.  See the License for the
 * specific language governing permissions and limitations
 * under the License.
 */
#include <gtest/gtest.h>
#include <pulsar/st/Client.h>

#include <string>

// Broker-free tests for PulsarClientBuilder::build() and the client shell: they
// validate configuration mapping and lifecycle, never connecting anywhere.

using namespace pulsar::st;

TEST(StClientTest, testEmptyServiceUrlIsRejected) {
    auto client = PulsarClient::builder().build();
    ASSERT_FALSE(client);
    ASSERT_EQ(client.error().result, ResultInvalidUrl);
}

TEST(StClientTest, testTlsEnabledRequiresTlsScheme) {
    auto client =
        PulsarClient::builder().serviceUrl("pulsar://localhost:6650").tlsPolicy({.enabled = true}).build();
    ASSERT_FALSE(client);
    ASSERT_EQ(client.error().result, ResultInvalidConfiguration);
}

TEST(StClientTest, testTlsEnabledAcceptsTlsScheme) {
    auto client = PulsarClient::builder()
                      .serviceUrl("pulsar+ssl://localhost:6651")
                      .tlsPolicy({.enabled = true, .allowInsecureConnection = true})
                      .build();
    ASSERT_TRUE(client);
    ASSERT_TRUE(client->close());
}

TEST(StClientTest, testBuildAndCloseWithoutBroker) {
    auto client = PulsarClient::builder().serviceUrl("pulsar://localhost:6650").build();
    ASSERT_TRUE(client);
    ASSERT_TRUE(static_cast<bool>(*client));

    auto closed = client->close();
    ASSERT_TRUE(closed);
}

TEST(StClientTest, testBuildWithPoliciesWithoutBroker) {
    using namespace std::chrono_literals;
    auto client = PulsarClient::builder()
                      .serviceUrl("pulsar://localhost:6650")
                      .connectionPolicy({.connectionsPerBroker = 2,
                                         .connectionTimeout = 5000ms,
                                         .operationTimeout = 20000ms,
                                         .keepAliveInterval = 30s})
                      .threadPolicy({.ioThreads = 2, .messageListenerThreads = 2})
                      .memoryPolicy({.limit = MemorySize::ofMiB(64)})
                      .backoffPolicy({.initialBackoff = 100ms, .maxBackoff = 10s})
                      .build();
    ASSERT_TRUE(client);
    ASSERT_TRUE(client->close());
}

TEST(StClientTest, testTransactionReportsNotSupportedYet) {
    auto client = PulsarClient::builder().serviceUrl("pulsar://localhost:6650").build();
    ASSERT_TRUE(client);

    auto txn = client->newTransaction();
    ASSERT_FALSE(txn);
    ASSERT_EQ(txn.error().result, ResultOperationNotSupported);

    ASSERT_TRUE(client->close());
}

TEST(StClientTest, testShutdownWithoutBroker) {
    auto client = PulsarClient::builder().serviceUrl("pulsar://localhost:6650").build();
    ASSERT_TRUE(client);
    client->shutdown();  // immediate teardown must not crash or hang
}
