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.DateFromStringValueProviderConfig;
import com.airlock.iam.elog.api.ELogger;
import com.airlock.iam.elog.api.ELoggerFactory;
import jakarta.inject.Inject;
import jakarta.inject.Provider;
import java.time.LocalDate;
import java.time.format.DateTimeParseException;

@LogicForConfig(DateFromStringValueProviderConfig.class)
public final class DateFromStringValueProvider implements ValueProvider<LocalDate> {
   private static final ELogger LOG = ELoggerFactory.getLogger(DateFromStringValueProvider.class);
   private final Provider<ValueProvider<String>> stringDateValueProvider;

   @Inject
   DateFromStringValueProvider(Provider<ValueProvider<String>> stringDateValueProvider) {
      this.stringDateValueProvider = stringDateValueProvider;
   }

   public LocalDate getValue() {
      String dateString = (String)((ValueProvider)this.stringDateValueProvider.get()).getValue();
      if (dateString == null) {
         LOG.info("Value is null, returning null instead of a date value.");
         return null;
      }

      try {
         return LocalDate.parse(dateString);
      } catch (DateTimeParseException e) {
         throw new ViolationException(
            "Could not parse date value " + (String)((ValueProvider)this.stringDateValueProvider.get()).getValue() + " as ISO-8601 date."
         );
      }
   }
}
