package com.airlock.iam.common.application.service.role;

import com.airlock.iam.common.api.domain.model.role.Role;
import com.airlock.iam.common.api.domain.model.user.PersistentUser;
import com.airlock.iam.common.domain.model.role.RoleCombination;
import com.airlock.iam.common.domain.model.role.Roles;
import com.airlock.iam.common.domain.model.role.RolesValidator;
import com.airlock.iam.log.api.signing.SigningLogger;
import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
import java.util.Optional;
import java.util.Set;

public class RolesFactory {
   private final Optional<Set<Role>> availableRoles;
   private final Optional<Set<RoleCombination>> availableRoleCombinations;
   private final SigningLogger signingLogger;

   public Roles forUser(PersistentUser user) {
      return new Roles(user, this.rolesValidator(), this.signingLogger);
   }

   public RolesValidator rolesValidator() {
      return new RolesValidator(this.availableRoles, this.availableRoleCombinations);
   }

   public static RolesFactory withoutRestrictions(SigningLogger signingLogger) {
      return new RolesFactory(Optional.empty(), Optional.empty(), signingLogger);
   }

   @SuppressFBWarnings(justification = "generated code")
   public RolesFactory(Optional<Set<Role>> availableRoles, Optional<Set<RoleCombination>> availableRoleCombinations, SigningLogger signingLogger) {
      this.availableRoles = availableRoles;
      this.availableRoleCombinations = availableRoleCombinations;
      this.signingLogger = signingLogger;
   }
}
