package com.airlock.iam.ssi.domain.model.step;

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.ssi.domain.model.SsiIssuanceSession;
import com.airlock.iam.ssi.domain.model.SsiVerificationSession;
import com.airlock.iam.ssi.domain.model.procivis.Sessions;

final class SsiSessionMapifier {
   private static final String TYPE_KEY = "type";
   private static final String PROCIVIS_TYPE = "procivis";
   private static final String CREDENTIAL_ID_KEY = "credentialId";
   private static final String PROOF_REQUEST_ID_KEY = "proofRequestId";
   private static final String URL_FOR_QR_CODE_KEY = "urlForQrCode";

   public static MapifiedValues mapifySsiVerificationSession(SsiVerificationSession session) {
      if (session instanceof Sessions.ProcivisVerificationSession(String proofRequestId, String urlForQrCode)) {
         return MapifiedValuesBuilder.mapifiedValues().put("type", "procivis").put("proofRequestId", proofRequestId).put("urlForQrCode", urlForQrCode).build();
      } else {
         throw new FailureException("Unknown Verification Session implementation: " + session.getClass().getName());
      }
   }

   public static SsiVerificationSession demapifySsiVerificationSession(MapifiedValues values) {
      if (values.<String>get("type").equals("procivis")) {
         return new Sessions.ProcivisVerificationSession(values.get("proofRequestId"), values.get("urlForQrCode"));
      } else {
         throw new FailureException("Unknown Verification Session type: " + values.get("type"));
      }
   }

   public static MapifiedValues mapifySsiIssuanceSession(SsiIssuanceSession session) {
      if (session instanceof Sessions.ProcivisIssuanceSession(String credentialId, String urlForQrCode)) {
         return MapifiedValuesBuilder.mapifiedValues().put("type", "procivis").put("credentialId", credentialId).put("urlForQrCode", urlForQrCode).build();
      } else {
         throw new FailureException("Unknown Issuance Session implementation: " + session.getClass().getName());
      }
   }

   public static SsiIssuanceSession demapifySsiIssuanceSession(MapifiedValues values) {
      if (values.<String>get("type").equals("procivis")) {
         return new Sessions.ProcivisIssuanceSession(values.get("credentialId"), values.get("urlForQrCode"));
      } else {
         throw new FailureException("Unknown Verification Session type: " + values.get("type"));
      }
   }
}
