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

import com.airlock.iam.oauth2.application.service.introspection.TokenIntrospectionResult;
import com.nimbusds.oauth2.sdk.Scope;
import com.nimbusds.oauth2.sdk.TokenIntrospectionSuccessResponse;
import com.nimbusds.oauth2.sdk.TokenIntrospectionSuccessResponse.Builder;
import com.nimbusds.oauth2.sdk.id.ClientID;
import com.nimbusds.oauth2.sdk.id.Subject;
import java.util.Date;
import java.util.Map;

public final class TokenIntrospectionResultMapper {
   private TokenIntrospectionResultMapper() {
   }

   public static TokenIntrospectionSuccessResponse mapTokenIntrospectionResponse(TokenIntrospectionResult result) {
      Builder responseBuilder = new Builder(result.isActive());
      if (result.isActive()) {
         responseBuilder.clientID(new ClientID(result.getClientId()))
            .subject(new Subject(result.getSubject()))
            .scope(new Scope(result.getScopes().toArray(String[]::new)))
            .expirationTime(result.getExpiryDate().map(Date::new).orElse(null))
            .issueTime(new Date(result.getGenerationDate()));
         result.getTokenBinding().ifPresent(binding -> responseBuilder.parameter("cnf", Map.of(binding.getMethod(), binding.getProof())));
      }

      return responseBuilder.build();
   }
}
