package com.airlock.iam.oauth2.domain.service.logout;

import com.airlock.iam.oauth2.application.configuration.client.OAuth2PostLogoutRedirectUriConfig;
import com.airlock.iam.oauth2.domain.model.token.IdToken;
import com.airlock.iam.oauth2.domain.service.client.EndSessionEndpointService;
import java.net.URI;
import lombok.NonNull;

public class LogoutPropagationServiceImpl implements LogoutPropagationService {
   private final boolean isEnabled;
   private final EndSessionEndpointService.EndSessionEndpointServiceBuilder endSessionEndpointService;

   public LogoutPropagationServiceImpl(
      boolean enablePostLogoutRedirect, @NonNull URI endSessionEndpoint, @NonNull OAuth2PostLogoutRedirectUriConfig postLogoutRedirectUri
   ) {
      if (endSessionEndpoint == null) {
         throw new NullPointerException("endSessionEndpoint is marked non-null but is null");
      }

      if (postLogoutRedirectUri == null) {
         throw new NullPointerException("postLogoutRedirectUri is marked non-null but is null");
      }

      this.isEnabled = enablePostLogoutRedirect;
      this.endSessionEndpointService = EndSessionEndpointService.builder()
         .redirectUrl(postLogoutRedirectUri.getUri().orElse(null))
         .endpoint(endSessionEndpoint);
   }

   @Override
   public boolean isEnabled() {
      return this.isEnabled;
   }

   @Override
   public URI provideLogoutUri(IdToken token) {
      return this.endSessionEndpointService.idToken(token).build().getLogoutUrl();
   }
}
