package com.airlock.iam.techclientreg.domain.service;

import com.airlock.iam.base.api.domain.model.exception.FailureException;
import com.airlock.iam.base.api.domain.model.plugin.LogicForConfig;
import com.airlock.iam.oauth2.application.configuration.OAuth2ClientRegistrationConfig;
import com.airlock.iam.techclient.auth.domain.model.oauth2.OAuth2TechClient;
import com.airlock.iam.techclientreg.api.domain.model.oauth2.OAuth2ClientRegistrationError;
import com.airlock.iam.techclientreg.api.domain.model.oauth2.OAuth2ClientRegistrationRequest;
import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
import java.util.Optional;

@LogicForConfig(OAuth2ClientRegistrationConfig.class)
public interface OAuth2ClientRegistrationLogic {
   OAuth2ClientRegistrationLogic.OAuth2ClientRegistrationResponse registerClient(OAuth2ClientRegistrationRequest var1);

   class OAuth2ClientRegistrationResponse {
      private final Optional<OAuth2TechClient> client;
      private final Optional<OAuth2ClientRegistrationError> error;

      public static OAuth2ClientRegistrationLogic.OAuth2ClientRegistrationResponse success(OAuth2TechClient client) {
         return new OAuth2ClientRegistrationLogic.OAuth2ClientRegistrationResponse(Optional.of(client), Optional.empty());
      }

      public static OAuth2ClientRegistrationLogic.OAuth2ClientRegistrationResponse failure(OAuth2ClientRegistrationError error) {
         return new OAuth2ClientRegistrationLogic.OAuth2ClientRegistrationResponse(Optional.empty(), Optional.of(error));
      }

      public boolean isSuccess() {
         return this.client.isPresent();
      }

      public OAuth2TechClient getClient() {
         return this.client.orElseThrow(() -> new FailureException("Trying to get client from error response"));
      }

      public OAuth2ClientRegistrationError getError() {
         return this.error.orElseThrow(() -> new FailureException("Trying to get error from success response"));
      }

      @SuppressFBWarnings(justification = "generated code")
      private OAuth2ClientRegistrationResponse(Optional<OAuth2TechClient> client, Optional<OAuth2ClientRegistrationError> error) {
         this.client = client;
         this.error = error;
      }
   }
}
