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

import com.airlock.iam.base.api.domain.model.mapification.Mapifiable;
import com.airlock.iam.base.api.domain.model.mapification.MapifiedValues;
import com.airlock.iam.base.api.domain.model.plugin.LogicForConfig;
import com.airlock.iam.base.domain.model.mapification.MapifiedValuesBuilder;
import com.airlock.iam.flow.shared.api.domain.model.captcha.CaptchaChallenge;
import com.airlock.iam.flow.shared.application.configuration.captcha.ReCaptchaConfig;
import com.airlock.iam.flow.shared.domain.service.captcha.CaptchaValidationService;
import jakarta.inject.Inject;
import jakarta.inject.Provider;

@LogicForConfig(ReCaptchaConfig.class)
public final class ReCaptcha extends ReCaptchaBasedProvider {
   @Inject
   public ReCaptcha(Provider<CaptchaCredentials> credentials, Provider<CaptchaValidationService> validator) {
      super(credentials, validator);
   }

   @Override
   public CaptchaChallenge getChallenge() {
      return new ReCaptcha.ReCaptchaChallenge(this.getKey());
   }

   public record ReCaptchaChallenge(String key) implements CaptchaChallenge, Mapifiable {
      public static final String RECAPTCHA_TYPE = "RE_CAPTCHA";
      private static final String KEY_KEY = "key";

      @Override
      public String type() {
         return "RE_CAPTCHA";
      }

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

      public static ReCaptcha.ReCaptchaChallenge demapify(MapifiedValues values) {
         return new ReCaptcha.ReCaptchaChallenge(values.get("key"));
      }
   }
}
