package com.airlock.iam.oauth2.domain.service.client.resource;

import com.airlock.iam.common.api.domain.model.role.Role;
import com.airlock.iam.common.api.domain.model.user.ProvidedUsername;
import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
import java.util.Collections;
import java.util.Map;
import java.util.Optional;
import java.util.Set;

public final class DefaultOAuth2SingleResourceData implements OAuth2SingleResourceData {
   private final Optional<ProvidedUsername> username;
   private final Set<Role> roles;
   private final Map<String, Object> contextData;

   private static DefaultOAuth2SingleResourceData.DefaultOAuth2SingleResourceDataBuilder builder() {
      return new DefaultOAuth2SingleResourceData.DefaultOAuth2SingleResourceDataBuilder()
         .username(Optional.empty())
         .roles(Collections.emptySet())
         .contextData(Collections.emptyMap());
   }

   public static OAuth2SingleResourceData resourceDataWithUsername(ProvidedUsername providedUsername) {
      return builder().username(Optional.of(providedUsername)).build();
   }

   public static OAuth2SingleResourceData resourceDataWithRoles(Set<Role> roles) {
      return builder().roles(roles).build();
   }

   public static OAuth2SingleResourceData resourceDataWithContextData(Map<String, Object> contextData) {
      return builder().contextData(contextData).build();
   }

   public static OAuth2SingleResourceData emptyResourceData() {
      return builder().build();
   }

   @Override
   public boolean isSuccessful() {
      return true;
   }

   @SuppressFBWarnings(justification = "generated code")
   @Override
   public Optional<ProvidedUsername> getUsername() {
      return this.username;
   }

   @SuppressFBWarnings(justification = "generated code")
   @Override
   public Set<Role> getRoles() {
      return this.roles;
   }

   @SuppressFBWarnings(justification = "generated code")
   @Override
   public Map<String, Object> getContextData() {
      return this.contextData;
   }

   @SuppressFBWarnings(justification = "generated code")
   private DefaultOAuth2SingleResourceData(Optional<ProvidedUsername> username, Set<Role> roles, Map<String, Object> contextData) {
      this.username = username;
      this.roles = roles;
      this.contextData = contextData;
   }

   @SuppressFBWarnings(justification = "generated code")
   public static class DefaultOAuth2SingleResourceDataBuilder {
      @SuppressFBWarnings(justification = "generated code")
      private Optional<ProvidedUsername> username;
      @SuppressFBWarnings(justification = "generated code")
      private Set<Role> roles;
      @SuppressFBWarnings(justification = "generated code")
      private Map<String, Object> contextData;

      @SuppressFBWarnings(justification = "generated code")
      DefaultOAuth2SingleResourceDataBuilder() {
      }

      @SuppressFBWarnings(justification = "generated code")
      public DefaultOAuth2SingleResourceData.DefaultOAuth2SingleResourceDataBuilder username(Optional<ProvidedUsername> username) {
         this.username = username;
         return this;
      }

      @SuppressFBWarnings(justification = "generated code")
      public DefaultOAuth2SingleResourceData.DefaultOAuth2SingleResourceDataBuilder roles(Set<Role> roles) {
         this.roles = roles;
         return this;
      }

      @SuppressFBWarnings(justification = "generated code")
      public DefaultOAuth2SingleResourceData.DefaultOAuth2SingleResourceDataBuilder contextData(Map<String, Object> contextData) {
         this.contextData = contextData;
         return this;
      }

      @SuppressFBWarnings(justification = "generated code")
      public DefaultOAuth2SingleResourceData build() {
         return new DefaultOAuth2SingleResourceData(this.username, this.roles, this.contextData);
      }

      @SuppressFBWarnings(justification = "generated code")
      @Override
      public String toString() {
         return "DefaultOAuth2SingleResourceData.DefaultOAuth2SingleResourceDataBuilder(username="
            + this.username
            + ", roles="
            + this.roles
            + ", contextData="
            + this.contextData
            + ")";
      }
   }
}
