package com.airlock.iam.common.infrastructure.mapper;

import com.airlock.iam.base.infrastructure.mapper.IdentityFieldMapper;
import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
import java.util.ArrayList;
import java.util.Collections;
import java.util.LinkedHashMap;
import java.util.Map;
import java.util.Map.Entry;

@SuppressFBWarnings("UWF_FIELD_NOT_INITIALIZED_IN_CONSTRUCTOR")
public class MapBasedFieldMapper extends IdentityFieldMapper {
   private Map<String, String> mappings;

   @Override
   public String map(String modelField) {
      return super.map(this.mappings.getOrDefault(modelField, modelField));
   }

   @SuppressFBWarnings(justification = "generated code")
   MapBasedFieldMapper(Map<String, String> mappings) {
      this.mappings = mappings;
   }

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

   @SuppressFBWarnings(justification = "generated code")
   public static class MapBasedFieldMapperBuilder {
      @SuppressFBWarnings(justification = "generated code")
      private ArrayList<String> mappings$key;
      @SuppressFBWarnings(justification = "generated code")
      private ArrayList<String> mappings$value;

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

      @SuppressFBWarnings(justification = "generated code")
      public MapBasedFieldMapper.MapBasedFieldMapperBuilder mapping(String mappingKey, String mappingValue) {
         if (this.mappings$key == null) {
            this.mappings$key = new ArrayList<>();
            this.mappings$value = new ArrayList<>();
         }

         this.mappings$key.add(mappingKey);
         this.mappings$value.add(mappingValue);
         return this;
      }

      @SuppressFBWarnings(justification = "generated code")
      public MapBasedFieldMapper.MapBasedFieldMapperBuilder mappings(Map<? extends String, ? extends String> mappings) {
         if (mappings == null) {
            throw new NullPointerException("mappings cannot be null");
         }

         if (this.mappings$key == null) {
            this.mappings$key = new ArrayList<>();
            this.mappings$value = new ArrayList<>();
         }

         for (Entry<? extends String, ? extends String> $lombokEntry : mappings.entrySet()) {
            this.mappings$key.add($lombokEntry.getKey());
            this.mappings$value.add($lombokEntry.getValue());
         }

         return this;
      }

      @SuppressFBWarnings(justification = "generated code")
      public MapBasedFieldMapper.MapBasedFieldMapperBuilder clearMappings() {
         if (this.mappings$key != null) {
            this.mappings$key.clear();
            this.mappings$value.clear();
         }

         return this;
      }

      @SuppressFBWarnings(justification = "generated code")
      public MapBasedFieldMapper build() {
         return new MapBasedFieldMapper(
            switch (this.mappings$key == null ? 0 : this.mappings$key.size()) {
               case 0 -> Collections.emptyMap();
               case 1 -> Collections.singletonMap(this.mappings$key.get(0), this.mappings$value.get(0));
               default -> {
                  Map<String, String> mappings = new LinkedHashMap<>(
                     this.mappings$key.size() < 1073741824 ? 1 + this.mappings$key.size() + (this.mappings$key.size() - 3) / 3 : Integer.MAX_VALUE
                  );

                  for (int $i = 0; $i < this.mappings$key.size(); $i++) {
                     mappings.put(this.mappings$key.get($i), this.mappings$value.get($i));
                  }

                  yield Collections.unmodifiableMap(mappings);
               }
            }
         );
      }

      @SuppressFBWarnings(justification = "generated code")
      @Override
      public String toString() {
         return "MapBasedFieldMapper.MapBasedFieldMapperBuilder(mappings$key=" + this.mappings$key + ", mappings$value=" + this.mappings$value + ")";
      }
   }
}
