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

import com.airlock.iam.base.domain.service.uri.UrlUtils;
import com.airlock.iam.common.api.domain.model.role.Role;
import jakarta.annotation.Nullable;
import java.util.Arrays;
import java.util.Comparator;
import java.util.Set;
import java.util.stream.Collectors;
import org.apache.commons.lang3.StringUtils;

public final class RolesSerializer {
   private static final String LIST_SEPARATOR = ",";

   public static Set<Role> deserializeRoles(@Nullable String rawRoles) {
      return StringUtils.isBlank(rawRoles) ? Set.of() : decodeRoles(rawRoles);
   }

   public static String serializeRoles(Set<Role> roles) {
      return roles.stream().sorted(Comparator.comparing(Role::formatRole)).map(RolesSerializer::encodeRole).collect(Collectors.joining(","));
   }

   private static Set<Role> decodeRoles(String rolesString) {
      return Arrays.stream(rolesString.split(",")).map(RolesSerializer::decodeRole).collect(Collectors.toUnmodifiableSet());
   }

   private static Role decodeRole(String role) {
      return Role.parseRole(UrlUtils.urlDecode(role));
   }

   private static String encodeRole(Role role) {
      return UrlUtils.urlEncodeUrlParameter(role.toString());
   }

   private RolesSerializer() {
   }
}
