package de.ozgcloud.xta.client;

import static de.ozgcloud.xta.client.extension.XtaServerSetupExtensionTestUtil.TEST_AUTHOR_CLIENT_IDENTIFIER;
import static org.assertj.core.api.Assertions.*;

import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Nested;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.condition.EnabledIfEnvironmentVariable;
import org.junit.jupiter.api.extension.RegisterExtension;
import org.junit.jupiter.params.ParameterizedTest;
import org.junit.jupiter.params.provider.ValueSource;

import de.ozgcloud.xta.client.extension.XtaMessageExampleLoader;
import de.ozgcloud.xta.client.extension.XtaRemoteServerSetupExtension;
import de.ozgcloud.xta.client.model.XtaFile;
import de.ozgcloud.xta.client.model.XtaIdentifier;
import de.ozgcloud.xta.client.model.XtaMessage;
import de.ozgcloud.xta.client.model.XtaMessageStatus;
import de.ozgcloud.xta.client.xdomea.XdomeaXtaMessageCreator;
import lombok.SneakyThrows;
import lombok.extern.slf4j.Slf4j;

@Slf4j
@EnabledIfEnvironmentVariable(
		named = "KOP_SH_KIEL_DEV_PATH",
		matches = ".+",
		disabledReason =
				"This test requires the path KOP_SH_KIEL_{DEV,TEST}_PATH and password KOP_SH_KIEL_{DEV,TEST}_PASSWORD of KOP_SH_KIEL_DEV.p12 and OZG-CLOUD_SH_KIEL_TEST.pfx. "
						+ "Additionally, the endpoint of the DEV-xta-server at li33-0005.dp.dsecurecloud.de must be reachable."
)
class XtaClientEnaioExampleRemoteITCase {

	@RegisterExtension
	private static final XtaRemoteServerSetupExtension XTA_REMOTE_SERVER_SETUP_EXTENSION = new XtaRemoteServerSetupExtension();

	private static final XdomeaXtaMessageCreator XDOMEA_XTA_MESSAGE_CREATOR = XdomeaXtaMessageCreator.createInstance();


	private XtaClient testClient;

	@BeforeEach
	@SneakyThrows
	void setup() {
		testClient = XTA_REMOTE_SERVER_SETUP_EXTENSION.getTestClient();
	}

	@DisplayName("send messages")
	@Nested
	class TestSendMessage {

		@DisplayName("should have open status for enaio messages")
		@SneakyThrows
		@ParameterizedTest
		@ValueSource(strings = { "abgabe0401-enaio-01", "abgabe0401-enaio-02", "abgabe0401-enaio-03", "abgabe0401-enaio-04" })
		void shouldReturn(String messageLabel) {
			XtaMessage xtaMessage = createXdomeaMessage(loadMessage(messageLabel).messageFile());

			var result = testClient.sendMessage(xtaMessage);

			assertThat(result.status()).isEqualTo(XtaMessageStatus.OPEN);
		}

	}

	@DisplayName("should fetch messages")
	@Test
	@SneakyThrows
	void shouldFetchMessages() {
		var result = testClient.fetchMessages(message -> {
			log.info("message: {}", message);
			throw new RuntimeException("avoid closing message");
		});

		assertThat(result).isNotEmpty();
	}

	@SneakyThrows
	private static XtaMessage createXdomeaMessage(XtaFile messageFile) {
		return XDOMEA_XTA_MESSAGE_CREATOR.createMessage(messageFile);
	}

	private static XtaMessage loadMessage(String messageLabel) {
		return XtaMessageExampleLoader.load(XtaMessageExampleLoader.MessageExampleConfig.builder()
				.messageLabel(messageLabel)
				.author(TEST_AUTHOR_CLIENT_IDENTIFIER)
				.reader(XtaIdentifier.builder()
						.category("Generischer Antragsempfänger")
						.value("gae:ozg-cloud-dms@optimal-systems.de")
						.name("DMS enaio (Optimal-Systems)")
						.build())
				.build());
	}

}