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.Objects;
import java.util.Set;

public final class OAuth2ResourceData {
   private final ProvidedUsername providedUsername;
   private final Set<Role> roles;
   private final Map<String, Object> contextData;

   public static OAuth2ResourceData.OAuth2ResourceDataBuilder builder(ProvidedUsername providedUsername) {
      return new OAuth2ResourceData.OAuth2ResourceDataBuilder()
         .providedUsername(Objects.requireNonNull(providedUsername))
         .roles(Collections.emptySet())
         .contextData(Collections.emptyMap());
   }

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

   @SuppressFBWarnings(justification = "generated code")
   public ProvidedUsername getProvidedUsername() {
      return this.providedUsername;
   }

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

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

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

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

      @SuppressFBWarnings(justification = "generated code")
      public OAuth2ResourceData.OAuth2ResourceDataBuilder providedUsername(ProvidedUsername providedUsername) {
         this.providedUsername = providedUsername;
         return this;
      }

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

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

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

      @SuppressFBWarnings(justification = "generated code")
      @Override
      public String toString() {
         return "OAuth2ResourceData.OAuth2ResourceDataBuilder(providedUsername="
            + this.providedUsername
            + ", roles="
            + this.roles
            + ", contextData="
            + this.contextData
            + ")";
      }
   }
}
