package com.airlock.iam.common.application.configuration.valueprovider;

import com.airlock.iam.common.api.application.configuration.valueprovider.DateAndTimeValueProviderConfig;
import com.airlock.iam.common.api.application.configuration.valueprovider.IntegerValueProviderConfig;
import com.airlock.iam.plugin.api.annotation.config.Plugin;
import com.airlock.iam.plugin.api.annotation.property.EnumProperty;
import com.airlock.iam.plugin.api.annotation.property.PluginProperty;
import com.airlock.iam.plugin.framework.domain.model.property.EnumPropertyTranslator;
import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;

@Plugin(description = "Defines a date and time value obtained by offsetting a date and time value by a fixed amount.")
public final class DateAndTimeWithOffsetValueProviderConfig implements DateAndTimeValueProviderConfig {
   @PluginProperty(description = "The date and time value to which an amount is added.", displayName = "Date And Time Provider", optional = false)
   private DateAndTimeValueProviderConfig dateAndTimeProvider;
   private static final String DATE_AND_TIME_PROVIDER_DISPLAY_NAME = "Date And Time Provider";
   @PluginProperty(
      description = "<p>The amount to offset Date And Time Provider by.</p><p>A positive offset will result in a later date and time than Date And Time Provider, while a negative offset will result in an earlier date and time.</p>",
      displayName = "Offset",
      optional = false
   )
   private IntegerValueProviderConfig offsetProvider;
   public static final String OFFSET_DISPLAY_NAME = "Offset";
   @EnumProperty(description = "The unit of Offset.", optional = false)
   private DateAndTimeWithOffsetValueProviderConfig.DateAndTimeUnit unit;

   public DateAndTimeValueProviderConfig getDateAndTimeProvider() {
      return this.dateAndTimeProvider;
   }

   public IntegerValueProviderConfig getOffsetProvider() {
      return this.offsetProvider;
   }

   public DateAndTimeWithOffsetValueProviderConfig.DateAndTimeUnit getUnit() {
      return this.unit;
   }

   @SuppressFBWarnings(justification = "generated code")
   public static DateAndTimeWithOffsetValueProviderConfig.DateAndTimeWithOffsetValueProviderConfigBuilder builder() {
      return new DateAndTimeWithOffsetValueProviderConfig.DateAndTimeWithOffsetValueProviderConfigBuilder();
   }

   @SuppressFBWarnings(justification = "generated code")
   public DateAndTimeWithOffsetValueProviderConfig() {
   }

   @SuppressFBWarnings(justification = "generated code")
   public DateAndTimeWithOffsetValueProviderConfig(
      DateAndTimeValueProviderConfig dateAndTimeProvider,
      IntegerValueProviderConfig offsetProvider,
      DateAndTimeWithOffsetValueProviderConfig.DateAndTimeUnit unit
   ) {
      this.dateAndTimeProvider = dateAndTimeProvider;
      this.offsetProvider = offsetProvider;
      this.unit = unit;
   }

   public enum DateAndTimeUnit implements EnumPropertyTranslator {
      YEARS("Years"),
      MONTHS("Months"),
      DAYS("Days"),
      HOURS("Hours"),
      MINUTES("Minutes"),
      SECONDS("Seconds"),
      MILLISECONDS("Milliseconds");

      private final String displayName;

      public String getDisplayValue() {
         return this.displayName;
      }

      @SuppressFBWarnings(justification = "generated code")
      DateAndTimeUnit(final String displayName) {
         this.displayName = displayName;
      }
   }

   @SuppressFBWarnings(justification = "generated code")
   public static class DateAndTimeWithOffsetValueProviderConfigBuilder {
      @SuppressFBWarnings(justification = "generated code")
      private DateAndTimeValueProviderConfig dateAndTimeProvider;
      @SuppressFBWarnings(justification = "generated code")
      private IntegerValueProviderConfig offsetProvider;
      @SuppressFBWarnings(justification = "generated code")
      private DateAndTimeWithOffsetValueProviderConfig.DateAndTimeUnit unit;

      @SuppressFBWarnings(justification = "generated code")
      DateAndTimeWithOffsetValueProviderConfigBuilder() {
      }

      @SuppressFBWarnings(justification = "generated code")
      public DateAndTimeWithOffsetValueProviderConfig.DateAndTimeWithOffsetValueProviderConfigBuilder dateAndTimeProvider(
         DateAndTimeValueProviderConfig dateAndTimeProvider
      ) {
         this.dateAndTimeProvider = dateAndTimeProvider;
         return this;
      }

      @SuppressFBWarnings(justification = "generated code")
      public DateAndTimeWithOffsetValueProviderConfig.DateAndTimeWithOffsetValueProviderConfigBuilder offsetProvider(IntegerValueProviderConfig offsetProvider) {
         this.offsetProvider = offsetProvider;
         return this;
      }

      @SuppressFBWarnings(justification = "generated code")
      public DateAndTimeWithOffsetValueProviderConfig.DateAndTimeWithOffsetValueProviderConfigBuilder unit(
         DateAndTimeWithOffsetValueProviderConfig.DateAndTimeUnit unit
      ) {
         this.unit = unit;
         return this;
      }

      @SuppressFBWarnings(justification = "generated code")
      public DateAndTimeWithOffsetValueProviderConfig build() {
         return new DateAndTimeWithOffsetValueProviderConfig(this.dateAndTimeProvider, this.offsetProvider, this.unit);
      }

      @SuppressFBWarnings(justification = "generated code")
      @Override
      public String toString() {
         return "DateAndTimeWithOffsetValueProviderConfig.DateAndTimeWithOffsetValueProviderConfigBuilder(dateAndTimeProvider="
            + this.dateAndTimeProvider
            + ", offsetProvider="
            + this.offsetProvider
            + ", unit="
            + this.unit
            + ")";
      }
   }
}
