package com.airlock.iam.oauth2.domain.model.provider;

import com.airlock.iam.base.api.domain.model.mapification.MapifiedValues;
import com.airlock.iam.base.domain.model.mapification.MapificationUtils;
import com.airlock.iam.base.domain.model.mapification.MapifiedValuesBuilder;
import com.airlock.iam.oauth2.domain.model.consent.OAuth2ConsentStatus;
import java.time.Instant;

public class OAuth2ScopeAttributeMapificationUtil {
   private static final String SCOPE_KEY = "scope";
   private static final String TRANSLATED_SCOPE_KEY = "translatedScope";
   private static final String CONSENT_STATUS_KEY = "consentStatus";
   private static final String UPDATED_AT_KEY = "consentUpdatedAt";

   public static MapifiedValues mapify(OAuth2ScopeAttribute attribute) {
      return MapifiedValuesBuilder.mapifiedValues()
         .put("scope", attribute.getScope())
         .putIfPresent("translatedScope", attribute.getTranslatedScope())
         .put("consentStatus", attribute.getConsentStatus().name())
         .putIfPresent("consentUpdatedAt", attribute.getUpdatedAt().map(Instant::toEpochMilli))
         .build();
   }

   public static OAuth2ScopeAttribute demapify(MapifiedValues values) {
      if (values.containsKey("consentUpdatedAt") && values.containsKey("translatedScope")) {
         return OAuth2ScopeAttribute.oAuth2ScopeAttribute(
            values.get("scope"),
            values.get("translatedScope"),
            MapificationUtils.demapifyEnumOfClass(values.get("consentStatus"), OAuth2ConsentStatus.class),
            Instant.ofEpochMilli(values.<Long>get("consentUpdatedAt"))
         );
      } else if (values.containsKey("consentUpdatedAt")) {
         return OAuth2ScopeAttribute.oAuth2ScopeAttribute(
            values.get("scope"),
            MapificationUtils.demapifyEnumOfClass(values.get("consentStatus"), OAuth2ConsentStatus.class),
            Instant.ofEpochMilli(values.<Long>get("consentUpdatedAt"))
         );
      } else {
         return values.containsKey("translatedScope")
            ? OAuth2ScopeAttribute.oAuth2ScopeAttribute(values.get("scope"), values.get("translatedScope"))
            : OAuth2ScopeAttribute.oAuth2ScopeAttribute(values.get("scope"));
      }
   }
}
