package com.airlock.iam.common.application.query.restriction;

import ch.ergon.restal.jsonapi.parameter.FilterParameter.Operator;
import com.airlock.iam.base.api.domain.model.store.query.Restriction;
import com.airlock.iam.base.api.domain.model.store.query.StringField;
import com.airlock.iam.common.api.domain.model.user.PersistentUser;
import com.airlock.iam.common.application.query.FilterData;
import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
import java.util.Optional;

public class StringRestrictionProvider implements QueryFilterRestrictionProvider {
   private String property;

   @Override
   public Optional<Restriction> getRestriction(FilterData data) {
      StringField<PersistentUser> field = this.getField(data);
      String value = data.getCondition().getValue();
      boolean caseSensitive = data.isCaseSensitive();
      return data.getCondition().getOperator() == Operator.CONTAINS
         ? Optional.of(this.stringContains(field, value, caseSensitive))
         : Optional.of(this.stringIsEqual(field, value, caseSensitive));
   }

   protected StringField<PersistentUser> getField(FilterData data) {
      return data.getSchema().customFields().string(data.getCondition().getProperty());
   }

   private Restriction stringIsEqual(StringField<PersistentUser> field, String value, boolean caseSensitive) {
      return caseSensitive ? field.equal(value) : field.equalIgnoreCase(value);
   }

   private Restriction stringContains(StringField<PersistentUser> field, String value, boolean caseSensitive) {
      return caseSensitive ? field.contains(value) : field.containsIgnoreCase(value);
   }

   @SuppressFBWarnings(justification = "generated code")
   public StringRestrictionProvider(String property) {
      this.property = property;
   }

   @SuppressFBWarnings(justification = "generated code")
   @Override
   public String getProperty() {
      return this.property;
   }
}
