package com.airlock.iam.base.infrastructure.validation;

import ch.ergon.restal.jsonapi.parameter.PageParameter;
import io.swagger.v3.oas.annotations.media.Schema;
import jakarta.inject.Inject;
import jakarta.inject.Provider;

public class SanitizedPageParameter extends PageParameter {
   private final Provider<PageParameterLimits> pagingParameterLimits;

   @Inject
   public SanitizedPageParameter(Provider<PageParameterLimits> pagingParameterLimits) {
      this.pagingParameterLimits = pagingParameterLimits;
   }

   @Schema(description = "The number of entries in the page.")
   public int getLimit() {
      return this.getSanitizedLimit(
         ((PageParameterLimits)this.pagingParameterLimits.get()).defaultPageSize(), ((PageParameterLimits)this.pagingParameterLimits.get()).maxPageSize()
      );
   }

   @Schema(description = "The page size to use")
   public int getSize() {
      return this.getLimit();
   }

   @Schema(description = "The offset of the first element to retrieve.")
   public int getOffset() {
      return super.getOffset();
   }

   public int getRequestedLimit() {
      return super.getLimit();
   }

   public int getDefaultPageSize() {
      return ((PageParameterLimits)this.pagingParameterLimits.get()).defaultPageSize();
   }

   public int getMaxPageSize() {
      return ((PageParameterLimits)this.pagingParameterLimits.get()).maxPageSize();
   }

   public PageParameter originallyRequestedPaging() {
      return withOffsetAndLimit(this.getOffset(), this.getRequestedLimit());
   }
}
