package com.airlock.iam.oauth2.domain.model.userinfo;

import com.airlock.iam.common.api.domain.model.claims.Claim;
import com.airlock.iam.common.domain.model.claims.ClaimSet;
import com.airlock.iam.common.domain.model.claims.SubjectClaim;
import com.nimbusds.oauth2.sdk.id.Subject;
import com.nimbusds.openid.connect.sdk.claims.UserInfo;
import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
import org.apache.commons.lang3.Strings;

public final class OpenIDConnectUserInfo {
   private final UserInfo userInfo;

   public static OpenIDConnectUserInfo userInfo(SubjectClaim sub, ClaimSet claimSet) {
      UserInfo userInfo = new UserInfo(new Subject(sub.value().value()));

      for (Claim<?> additionalClaim : claimSet.getClaims()) {
         if (!Strings.CS.equals("sub", additionalClaim.name())) {
            userInfo.setClaim(additionalClaim.name(), additionalClaim.value().toJSONSerializable());
         }
      }

      return new OpenIDConnectUserInfo(userInfo);
   }

   @SuppressFBWarnings(justification = "generated code")
   private OpenIDConnectUserInfo(UserInfo userInfo) {
      this.userInfo = userInfo;
   }

   @SuppressFBWarnings(justification = "generated code")
   public UserInfo getUserInfo() {
      return this.userInfo;
   }
}
