package com.airlock.iam.oauth2.application.service.token;

import com.airlock.iam.common.api.domain.model.user.PersistentUser;
import com.airlock.iam.core.misc.util.ticket.KeyMultiValue;
import com.airlock.iam.core.misc.util.ticket.Ticket;
import com.airlock.iam.oauth2.api.domain.model.OAuth2Scope;
import com.airlock.iam.oauth2.domain.model.token.OAuth2AccessToken;
import com.google.common.collect.Sets;
import java.time.Duration;
import java.time.Instant;
import java.util.ArrayList;
import java.util.Optional;
import java.util.Set;

public final class OAuth2TicketBuilderFactory {
   public static Ticket buildTicket(PersistentUser user, OAuth2AccessToken token, boolean addScopesAsRoles) {
      Optional<Instant> validity = token.getExpiry();
      Ticket ticket = new Ticket(validity.orElse(Instant.now().plus(Duration.ofDays(365L))));
      ticket.addKeyMultiValue(new KeyMultiValue("username", user.getName()));
      ticket.setUniqueId(token.getHashedTokenSecret());
      Set<String> roles = Sets.newHashSet();
      if (addScopesAsRoles) {
         roles.addAll(OAuth2Scope.convertToScopeNames(token.getScopes().scopesAsSet()));
      }

      ticket.addKeyMultiValue(new KeyMultiValue("roles", new ArrayList<>(roles)));
      return ticket;
   }

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