package dev.fitko.fitconnect.integrationtests;

import dev.fitko.fitconnect.api.config.ApplicationConfig;
import dev.fitko.fitconnect.api.domain.model.submission.SubmissionForPickup;
import dev.fitko.fitconnect.client.factory.ClientFactory;
import dev.fitko.fitconnect.client.sender.model.SendableSubmission;
import dev.fitko.fitconnect.integrationtests.condition.EnableIfEnvironmentVariablesAreSet;
import org.hamcrest.MatcherAssert;
import org.hamcrest.Matchers;
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.Test;

import java.util.List;
import java.util.Set;
import java.util.UUID;
import java.util.stream.Collectors;

@EnableIfEnvironmentVariablesAreSet
public class SubscriberClientIT extends IntegrationTestBase {

    @Test
    void testListSubmissionsForDestination() {

        // Given
        final ApplicationConfig config = getConfigWithCredentialsFromEnvironment("TESTING", true);

        final var senderClient = ClientFactory.getSenderClient(config);
        final var subscriberClient = ClientFactory.getSubscriberClient(config);

        final UUID destinationId = UUID.fromString(System.getenv("TEST_DESTINATION_ID"));
        final String leikaKey = "urn:de:fim:leika:leistung:99400048079000";
        final String serviceName = "Test Service";

        final var submissionOne = SendableSubmission.Builder()
                .setDestination(destinationId)
                .setServiceType(leikaKey, serviceName)
                .setJsonData("{ \"data\": \"Beispiel Fachdaten 1\" }")
                .build();

        final var submissionTwo = SendableSubmission.Builder()
                .setDestination(destinationId)
                .setServiceType(leikaKey, serviceName)
                .setJsonData("{ \"data\": \"Beispiel Fachdaten 2\" }")
                .build();

        final var sentSubmissionOne = senderClient.send(submissionOne);
        final var sentSubmissionTwo = senderClient.send(submissionTwo);

        Assertions.assertNotNull(sentSubmissionOne);
        Assertions.assertNotNull(sentSubmissionTwo);

        // When
        final Set<SubmissionForPickup> submissions = subscriberClient.getAvailableSubmissionsForDestination(destinationId);

        // Then
        Assertions.assertFalse(submissions.isEmpty());

        final List<UUID> submissionIds = submissions.stream().map(SubmissionForPickup::getSubmissionId).collect(Collectors.toList());

        MatcherAssert.assertThat(submissionIds, Matchers.hasItems(sentSubmissionOne.getSubmissionId(), sentSubmissionTwo.getSubmissionId()));

        // remove by confirming
        subscriberClient.requestSubmission(sentSubmissionOne.getSubmissionId()).acceptSubmission();
        subscriberClient.requestSubmission(sentSubmissionTwo.getSubmissionId()).acceptSubmission();
    }
}