package de.ozgcloud.xta.client;

import static com.github.tomakehurst.wiremock.client.WireMock.*;
import static com.github.tomakehurst.wiremock.core.WireMockConfiguration.options;
import static org.assertj.core.api.Assertions.*;

import java.io.File;

import org.apache.commons.io.FileUtils;
import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Test;

import com.github.tomakehurst.wiremock.WireMockServer;
import com.github.tomakehurst.wiremock.client.WireMock;

import de.ozgcloud.xta.client.config.XtaClientConfig;
import de.ozgcloud.xta.client.core.WrappedXtaService;
import de.ozgcloud.xta.client.core.WrappedXtaServiceFactory;
import de.ozgcloud.xta.client.factory.XtaMockServerResponseTestFactory;
import de.ozgcloud.xta.client.model.XtaIdentifier;
import lombok.SneakyThrows;

class XtaSchemaValidationITCase {

	WrappedXtaService xtaService;

	private static final String XTA_MOCK_SERVER_URL_BASE = "https://localhost:8089";
	private static final String XTA_MOCK_SERVER_URL_PATH = "/MB_XTA-WS/XTA210";
	private static final String XTA_MOCK_SERVER_URL = XTA_MOCK_SERVER_URL_BASE + XTA_MOCK_SERVER_URL_PATH;

	WireMockServer wireMockServer;

	@BeforeEach
	@SneakyThrows
	void setup() {
		wireMockServer = new WireMockServer(options()
				.port(8088)
				.httpsPort(8089)
				.keystorePath("store/xta-test-server_keystore.p12")
				.keystorePassword("password")
				.keystoreType("PKCS12")
				.caKeystorePath("store/xta-test_truststore.jks")
				.caKeystorePassword("password")
				.caKeystoreType("JKS")
		);
		wireMockServer.start();

		WireMock.configureFor(8088);

		xtaService = WrappedXtaServiceFactory.from(XtaClientConfig.builder()
				.schemaValidation(true)
				.logSoapResponses(true)
				.logSoapRequests(true)
				.trustStore(XtaClientConfig.KeyStore.builder()
						.content(FileUtils.readFileToByteArray(new File("src/test/resources/store/xta-test_truststore.jks")))
						.password("password".toCharArray())
						.type("JKS")
						.build())
				.clientCertKeystore(XtaClientConfig.KeyStore.builder()
						.content(FileUtils.readFileToByteArray(new File("src/test/resources/store/xta-test-client-john-smith_keystore.p12")))
						.password("password".toCharArray())
						.type("PKCS12")
						.build())
				.managementServiceUrl(wireMockServer.baseUrl() + XTA_MOCK_SERVER_URL_PATH + "managementPort.svc")
				.sendServiceUrl(wireMockServer.baseUrl() + XTA_MOCK_SERVER_URL_PATH + "sendPort.svc")
				.msgBoxServiceUrl(wireMockServer.baseUrl() + XTA_MOCK_SERVER_URL_PATH + "msgBoxPort.svc")
				.build()).create();
	}

	@AfterEach
	void tearDown() {
		wireMockServer.stop();
	}

	@DisplayName("should throw UnmarshallException on bad response")
	@Test
	@SneakyThrows
	void shouldThrowUnmarshallExceptionOnBadResponse() {
		wireMockServer.stubFor(post(XTA_MOCK_SERVER_URL_PATH + "msgBoxPort.svc")
				.willReturn(
						XtaMockServerResponseTestFactory.createConstantGetMessageResponse(
								"84d0edd7-709b-4a7b-9aac-b3ee82041ef0_Geschaeftsgang.Geschaeftsgang.0201.zip")));

		var message = xtaService.getMessage("urn:de:xta:messageid:dataport_xta_210:db6ad282-c510-4154-a167-daaa8b9f345a", XtaIdentifier.builder()
				.value("afmsh:ozg-cloud-stage-Utopia")
				.build());

		assertThat(message).isNotNull();
	}

	@DisplayName("should not fail on good response")
	@Test
	void shouldNotFailOnGoodResponse() {

	}
}