/*
 * Copyright (C) 2024 Das Land Schleswig-Holstein vertreten durch den
 * Ministerpräsidenten des Landes Schleswig-Holstein
 * Staatskanzlei
 * Abteilung Digitalisierung und zentrales IT-Management der Landesregierung
 *
 * Lizenziert unter der EUPL, Version 1.2 oder - sobald
 * diese von der Europäischen Kommission genehmigt wurden -
 * Folgeversionen der EUPL ("Lizenz");
 * Sie dürfen dieses Werk ausschließlich gemäß
 * dieser Lizenz nutzen.
 * Eine Kopie der Lizenz finden Sie hier:
 *
 * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12
 *
 * Sofern nicht durch anwendbare Rechtsvorschriften
 * gefordert oder in schriftlicher Form vereinbart, wird
 * die unter der Lizenz verbreitete Software "so wie sie
 * ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN -
 * ausdrücklich oder stillschweigend - verbreitet.
 * Die sprachspezifischen Genehmigungen und Beschränkungen
 * unter der Lizenz sind dem Lizenztext zu entnehmen.
 */
package de.ozgcloud.archive;

import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.annotation.EnableScheduling;

import de.ozgcloud.apilib.client_attribute.OzgCloudClientAttributeService;
import de.ozgcloud.apilib.client_attribute.grpc.OzgCloudClientAttributeGrpcService;
import de.ozgcloud.apilib.client_attribute.grpc.OzgCloudClientAttributeMapper;
import de.ozgcloud.apilib.common.command.OzgCloudCommandService;
import de.ozgcloud.apilib.common.command.grpc.CommandMapper;
import de.ozgcloud.apilib.common.command.grpc.GrpcOzgCloudCommandService;
import de.ozgcloud.apilib.file.OzgCloudFileService;
import de.ozgcloud.apilib.file.grpc.GrpcOzgCloudFileService;
import de.ozgcloud.apilib.file.grpc.OzgCloudFileMapper;
import de.ozgcloud.apilib.user.GrpcOzgCloudUserProfileService;
import de.ozgcloud.apilib.user.OzgCloudUserProfileService;
import de.ozgcloud.apilib.user.UserProfileMapper;
import de.ozgcloud.archive.common.callcontext.CallContextProvider;
import de.ozgcloud.user.grpc.userprofile.UserProfileServiceGrpc.UserProfileServiceBlockingStub;
import de.ozgcloud.vorgang.grpc.binaryFile.BinaryFileServiceGrpc.BinaryFileServiceBlockingStub;
import de.ozgcloud.vorgang.grpc.binaryFile.BinaryFileServiceGrpc.BinaryFileServiceStub;
import de.ozgcloud.vorgang.grpc.clientAttribute.ClientAttributeServiceGrpc.ClientAttributeServiceBlockingStub;
import de.ozgcloud.vorgang.grpc.command.CommandServiceGrpc.CommandServiceBlockingStub;
import lombok.RequiredArgsConstructor;
import net.devh.boot.grpc.client.inject.GrpcClient;

@Configuration
@RequiredArgsConstructor
@EnableScheduling
public class ArchiveManagerConfiguration {

	public static final String VORGANG_SERVICE_NAME = "archiveVorgangService";
	public static final String VORGANG_REMOTE_MANAGER_SERVICE_NAME = "archiveVorgangRemoteService";
	public static final String VORGANG_WITH_EINGANG_MAPPER_NAME = "archiveVorgangWithEingangMapper";

	public static final String CURRENT_USER_SERVICE_NAME = "archiveCurrentUserService";
	public static final String DOCUMENT_MAPPER_NAME = "archiveDocumentMapper";
	public static final String DOCUMENT_REMOTE_SERVICE_NAME = "archiveDocumentRemoteService";

	public static final String USER_SERVICE_NAME = "archiveUserService";
	public static final String USER_PROFILE_MAPPER_NAME = "archiveUserProfileMapper";
	public static final String OZGCLOUD_USER_PROFILE_SERVICE_NAME = "archiveOzgCloudUserProfileService";

	public static final String COMMAND_SERVICE_NAME = "archiveCommandService";
	public static final String COMMAND_REMOTE_SERVICE_NAME = "archiveCommandRemoteService";
	public static final String COMMAND_MAPPER_NAME = "archiveCommandMapper";
	public static final String OZGCLOUD_COMMAND_SERVICE_NAME = "archiveOzgCloudCommandService";

	public static final String BINARY_FILE_SERVICE_NAME = "archiveBinaryFileService";
	public static final String BINARY_FILE_REMOTE_SERVICE_NAME = "archiveBinaryFileRemoteService";
	public static final String OZGCLOUD_FILE_SERVICE_NAME = "archiveOzgCloudFileService";

	public static final String FILE_ID_MAPPER_NAME = "archiveFileIdMapper";

	public static final String BESCHEID_REMOTE_SERVICE_NAME = "archiveBescheidRemoteService";
	public static final String BESCHEID_MAPPER_NAME = "archiveBescheidMapper";

	public static final String CALL_CONTEXT_PROVIDER_NAME = "archiveCallContextProvider";
	public static final String CALL_CONTEXT_MAPPER_NAME = "archiveCallContextMapper";

	public static final String OZGCLOUD_CLIENT_ATTRIBUTE_SERVICE_NAME = "archiveOzgCloudClientAttributeService";

	public static final String KOMMENTAR_SERVICE_NAME = "archiveKommentarService";
	public static final String KOMMENTAR_REMOTE_SERVICE_NAME = "archiveKommentarRemoteService";

	public static final String CALL_CONTEXT_SERVER_INTERCEPTOR_NAME = "archiveCallContextGrpcServerInterceptor";

	public static final String GRPC_VORGANG_MANAGER_CLIENT_NAME = "vorgang-manager";
	public static final String GRPC_COMMAND_MANAGER_CLIENT_NAME = "command-manager";
	public static final String GRPC_FILE_MANAGER_CLIENT_NAME = "file-manager";
	public static final String GRPC_USER_MANAGER_CLIENT_NAME = "user-manager";

	@GrpcClient(GRPC_VORGANG_MANAGER_CLIENT_NAME)
	private final ClientAttributeServiceBlockingStub clientAttributeServiceBlockingStub;

	@GrpcClient(GRPC_COMMAND_MANAGER_CLIENT_NAME)
	private final CommandServiceBlockingStub commandServiceStub;

	@GrpcClient(GRPC_USER_MANAGER_CLIENT_NAME)
	private final UserProfileServiceBlockingStub userProfileServiceBlockingStub;

	@GrpcClient(GRPC_FILE_MANAGER_CLIENT_NAME)
	private final BinaryFileServiceBlockingStub binaryFileServiceBlockingStub;

	@GrpcClient(GRPC_FILE_MANAGER_CLIENT_NAME)
	private final BinaryFileServiceStub binaryFileServiceStub;

	@Bean(ArchiveManagerConfiguration.OZGCLOUD_FILE_SERVICE_NAME)
	OzgCloudFileService ozgCloudFileService(OzgCloudFileMapper mapper,
			@Qualifier(CALL_CONTEXT_PROVIDER_NAME) CallContextProvider callContextProvider) {
		return new GrpcOzgCloudFileService(binaryFileServiceBlockingStub, binaryFileServiceStub, callContextProvider, mapper);
	}

	@Bean(ArchiveManagerConfiguration.OZGCLOUD_USER_PROFILE_SERVICE_NAME)
	OzgCloudUserProfileService grpcOzgCloudUserProfileService(UserProfileMapper userProfileMapper,
			@Qualifier(CALL_CONTEXT_PROVIDER_NAME) CallContextProvider callContextProvider) {
		return new GrpcOzgCloudUserProfileService(userProfileServiceBlockingStub, userProfileMapper, callContextProvider);
	}

	@Bean(OZGCLOUD_CLIENT_ATTRIBUTE_SERVICE_NAME)
	OzgCloudClientAttributeService ozgCloudAttributesService(OzgCloudClientAttributeMapper mapper,
			@Qualifier(CALL_CONTEXT_PROVIDER_NAME) CallContextProvider callContextProvider) {
		return new OzgCloudClientAttributeGrpcService(clientAttributeServiceBlockingStub, mapper, callContextProvider);
	}

	@Bean(OZGCLOUD_COMMAND_SERVICE_NAME)
	OzgCloudCommandService ozgCloudCommandService(CommandMapper commandMapper,
			@Qualifier(CALL_CONTEXT_PROVIDER_NAME) CallContextProvider callContextProvider) {
		return new GrpcOzgCloudCommandService(commandServiceStub, commandMapper, callContextProvider,
				GrpcOzgCloudCommandService.DEFAULT_COMMAND_REQUEST_THRESHOLD_MILLIS);
	}
}