package com.airlock.iam.flow.shared.domain.model.continuation;

import com.airlock.iam.base.api.domain.model.exception.FailureException;
import com.airlock.iam.base.api.domain.model.mapification.MapifiedValues;
import com.airlock.iam.base.domain.model.mapification.MapifiedValuesBuilder;
import com.airlock.iam.common.api.domain.model.binary.ByteSequence;
import com.airlock.iam.flow.api.domain.model.session.SingleFlowScopedFlowAttribute;

public record FlowContinuationTokenHash(ByteSequence tokenHash) implements SingleFlowScopedFlowAttribute<FlowContinuationTokenHash> {
   private static final String TOKEN_HASH_KEY = "tokenHash";

   public static FlowContinuationTokenHash fromBase64Url(String encodedHash) {
      return new FlowContinuationTokenHash(
         ByteSequence.fromBase64Url(encodedHash).orElseThrow(() -> new FailureException("cannot decode hash: " + encodedHash))
      );
   }

   public static FlowContinuationTokenHash demapify(MapifiedValues values) {
      return fromBase64Url(values.get("tokenHash"));
   }

   public String base64Url() {
      return this.tokenHash.base64Url();
   }

   @Override
   public MapifiedValues mapify() {
      return MapifiedValuesBuilder.mapifiedValues().put("tokenHash", this.tokenHash.base64Url()).build();
   }

   public FlowContinuationTokenHash mergeWith(FlowContinuationTokenHash newAttribute) {
      return newAttribute;
   }
}
