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

import com.airlock.iam.common.api.domain.model.role.Role;
import java.util.Arrays;
import java.util.Collection;
import java.util.List;
import java.util.Objects;
import java.util.Set;
import java.util.stream.Collectors;
import java.util.stream.Stream;
import org.apache.commons.lang3.StringUtils;

public final class RolesUtil {
   public static Set<Role> roles(String... roles) {
      return rolesFrom(roles);
   }

   public static Set<Role> rolesFrom(String[] roles) {
      return rolesFrom(Arrays.stream(roles));
   }

   public static Set<Role> rolesFrom(Collection<String> roles) {
      return rolesFrom(roles.stream());
   }

   private static Set<Role> rolesFrom(Stream<String> roles) {
      return roles.<String>map(StringUtils::trimToNull).filter(Objects::nonNull).map(Role::parseRole).collect(Collectors.toSet());
   }

   public static String[] rolesToStringArray(Set<Role> roles) {
      return roles.stream().map(Role::formatRole).toArray(String[]::new);
   }

   public static List<String> rolesToStringList(Set<Role> roles) {
      return roles.stream().map(Role::formatRole).toList();
   }

   public static String rolesToCommaSeparatedString(Set<Role> roles) {
      return roles.stream().map(Role::formatRole).collect(Collectors.joining(","));
   }

   public static String[] roleNamesToStringArray(Set<Role> roles) {
      return roles.stream().map(Role::getRoleName).toArray(String[]::new);
   }

   public static String roleNamesToCommaSeparatedString(Set<Role> roles) {
      return roles.stream().map(Role::getRoleName).collect(Collectors.joining(","));
   }

   private RolesUtil() {
      throw new AssertionError();
   }
}
