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

import com.airlock.iam.common.api.domain.model.role.Role;
import com.airlock.iam.core.misc.util.ticket.Ticket;
import java.util.Arrays;
import java.util.List;
import java.util.Objects;
import java.util.Set;
import java.util.stream.Collectors;

public final class SsoTicketKeyRoleExtractor implements SsoTicketRoleExtractor {
   private final List<String> ticketKeys;

   private SsoTicketKeyRoleExtractor(List<String> ticketKeys) {
      this.ticketKeys = ticketKeys;
   }

   public static SsoTicketKeyRoleExtractor fromTicketKeys(List<String> ticketKeys) {
      return new SsoTicketKeyRoleExtractor(ticketKeys);
   }

   @Override
   public Set<Role> extract(Ticket ticket) {
      return this.ticketKeys
         .stream()
         .map(ticket::getValueForName)
         .filter(Objects::nonNull)
         .flatMap(kmv -> Arrays.stream(kmv.getValues()))
         .map(Role::parseRole)
         .collect(Collectors.toSet());
   }
}
