package com.airlock.iam.oauth2.infrastructure.mapper;

import com.airlock.iam.oauth2.domain.model.session.OAuth2CustomSessionAttribute;
import com.airlock.iam.oauth2.domain.model.session.OAuth2ExtendedSession;
import com.airlock.iam.oauth2.infrastructure.transfer.response.OAuth2SessionData;
import java.util.Map;
import java.util.stream.Collectors;
import ma.glasnost.orika.CustomMapper;
import ma.glasnost.orika.MapperFactory;
import ma.glasnost.orika.MappingContext;

public final class OAuth2ExtendedSessionToSessionDataMapper {
   public OAuth2ExtendedSessionToSessionDataMapper(MapperFactory factory) {
      this.configure(factory);
   }

   private void configure(MapperFactory factory) {
      factory.classMap(OAuth2ExtendedSession.class, OAuth2SessionData.class)
         .customize(new OAuth2ExtendedSessionToSessionDataMapper.OAuth2ExtendedSessionToSessionDataCustomMapper())
         .register();
   }

   public static final class OAuth2ExtendedSessionToSessionDataCustomMapper extends CustomMapper<OAuth2ExtendedSession, OAuth2SessionData> {
      public void mapAtoB(OAuth2ExtendedSession source, OAuth2SessionData target, MappingContext context) {
         target.setClientId(source.clientId().id());
         target.setConsentTimestamp(source.authenticationTimestamp());
         target.setAuthenticationTimestamp(source.authenticationTimestamp());
         Map<String, String> customAttributes = source.customAttributes()
            .stream()
            .collect(Collectors.toMap(OAuth2CustomSessionAttribute::getName, OAuth2CustomSessionAttribute::getValue));
         target.setCustomAttributes(customAttributes);
      }
   }
}
