package com.airlock.iam.common.domain.model.valueprovider;

import com.airlock.iam.base.api.domain.model.exception.ViolationException;
import com.airlock.iam.base.api.domain.model.plugin.LogicForConfig;
import com.airlock.iam.common.api.domain.model.valueprovider.ValueProvider;
import com.airlock.iam.common.application.configuration.valueprovider.DateAndTimeStaticValueProviderConfig;
import jakarta.inject.Inject;
import jakarta.inject.Provider;
import java.text.ParsePosition;
import java.util.Date;
import org.apache.commons.lang3.time.FastDateFormat;

@LogicForConfig(DateAndTimeStaticValueProviderConfig.class)
public final class DateAndTimeStaticValueProvider implements ValueProvider<Date> {
   private final Provider<DateAndTimeStaticValueProviderConfig> config;

   @Inject
   DateAndTimeStaticValueProvider(Provider<DateAndTimeStaticValueProviderConfig> config) {
      this.config = config;
   }

   public Date getValue() {
      String dateAndTimeString = ((DateAndTimeStaticValueProviderConfig)this.config.get()).getValue();
      ParsePosition position = new ParsePosition(0);
      FastDateFormat format = ((DateAndTimeStaticValueProviderConfig)this.config.get()).getFormat();
      Date dateAndTimeValue = format.parse(dateAndTimeString, position);
      if (position.getErrorIndex() >= 0) {
         throw new ViolationException(
            "The configured date and time \""
               + ((DateAndTimeStaticValueProviderConfig)this.config.get()).getValue()
               + "\" does not match the pattern \""
               + ((DateAndTimeStaticValueProviderConfig)this.config.get()).getFormat().getPattern()
               + "\"."
         );
      } else if (position.getIndex() < dateAndTimeString.length()) {
         throw new ViolationException(
            "The configured date and time \""
               + ((DateAndTimeStaticValueProviderConfig)this.config.get()).getValue()
               + "\" does not match the pattern \""
               + ((DateAndTimeStaticValueProviderConfig)this.config.get()).getFormat().getPattern()
               + "\"."
         );
      } else {
         return dateAndTimeValue;
      }
   }
}
