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

import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
import jakarta.annotation.Nullable;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Optional;

public enum Period {
   LAST_DAY("last_day", "usersearch.last-day", 86400000L),
   LAST_WEEK("last_week", "usersearch.last-week", 604800000L),
   LAST_MONTH("last_month", "usersearch.last-month", 2592000000L),
   LAST_YEAR("last_year", "usersearch.last-year", 31536000000L);

   private final String option;
   private final String key;
   private final long inMillis;

   Period(String option, String key, long inMillis) {
      this.option = option;
      this.key = key;
      this.inMillis = inMillis;
   }

   public static List<String> optionList() {
      List<String> list = new ArrayList<>();

      for (Period p : values()) {
         list.add(p.option);
      }

      return list;
   }

   public static List<String> keyList() {
      List<String> list = new ArrayList<>();

      for (Period p : values()) {
         list.add(p.key);
      }

      return list;
   }

   @Nullable
   public static Optional<Period> fromValue(@Nullable String value) {
      for (Period p : values()) {
         if (p.option.equals(value)) {
            return Optional.of(p);
         }
      }

      return Optional.empty();
   }

   public Date getBeginDate(Date date) {
      long millis = date.getTime();
      return new Date(millis - this.inMillis);
   }

   @SuppressFBWarnings(justification = "generated code")
   public String getOption() {
      return this.option;
   }
}
