package com.airlock.iam.common.domain.model.credential;

import com.airlock.iam.base.api.domain.model.plugin.LogicForConfig;
import com.airlock.iam.base.api.domain.model.user.UserId;
import com.airlock.iam.common.api.domain.model.authentication.AuthenticationResult;
import com.airlock.iam.common.api.domain.model.credential.RequestAuthentication;
import com.airlock.iam.common.api.domain.model.request.Request;
import com.airlock.iam.common.api.domain.model.user.UserIdentity;
import com.airlock.iam.common.application.configuration.credential.StaticRequestAuthenticationConfig;
import com.airlock.iam.common.domain.model.authentication.AuthenteeImpl;
import com.airlock.iam.common.domain.model.authentication.AuthenticationResultImpl;
import com.airlock.iam.common.domain.model.contextdata.ContextDataImpl;
import jakarta.inject.Inject;
import jakarta.inject.Provider;
import java.util.Collections;
import java.util.Optional;

@LogicForConfig(StaticRequestAuthenticationConfig.class)
public final class StaticRequestAuthentication implements RequestAuthentication {
   private final Provider<StaticRequestAuthenticationSettings> settings;

   @Inject
   public StaticRequestAuthentication(Provider<StaticRequestAuthenticationSettings> settings) {
      this.settings = settings;
   }

   @Override
   public Optional<AuthenticationResult> extractCredentialAndAuthenticate(Request request) {
      UserIdentity userIdentity = new UserIdentity(
         UserId.userId(((StaticRequestAuthenticationSettings)this.settings.get()).providedUsername().getValue()),
         ((StaticRequestAuthenticationSettings)this.settings.get()).providedUsername()
      );
      return Optional.of(
         new AuthenticationResultImpl(
            Collections.emptyList(),
            userIdentity,
            false,
            false,
            Optional.of(new AuthenteeImpl(userIdentity, Collections.emptySet(), ContextDataImpl.emptyContextData()))
         )
      );
   }
}
