package com.airlock.iam.flow.shared.application.service.recovery;

import com.airlock.iam.core.misc.util.ticket.Ticket;
import com.airlock.iam.flow.shared.domain.model.session.UserSessionAttributeCollectors;
import com.airlock.iam.flow.shared.domain.model.session.UserSessionAttributes;
import java.util.Map;
import java.util.Optional;
import java.util.stream.Collectors;

public final class UserSessionAttributesFromTicket {
   private final Ticket ticket;

   static UserSessionAttributes userSessionAttributes(Ticket ticket) {
      return new UserSessionAttributesFromTicket(ticket).attributes();
   }

   private UserSessionAttributesFromTicket(Ticket ticket) {
      this.ticket = ticket;
   }

   private UserSessionAttributes attributes() {
      return SessionAttributeReaderFactory.sessionAttributeReaderFactory(this.ticket)
         .map(reader -> reader.attribute(this.extractValues(reader.index())))
         .filter(Optional::isPresent)
         .map(Optional::get)
         .collect(UserSessionAttributeCollectors.toUserSessionAttributes());
   }

   private Map<String, String> extractValues(int currentIndex) {
      return RawSessionAttributeFactory.rawSessionAttributes(this.ticket, currentIndex)
         .collect(Collectors.toMap(RawSessionAttributeItem::key, RawSessionAttributeItem::value));
   }
}
