package com.airlock.iam.techclient.infrastructure.repository;

import java.util.HashMap;
import java.util.Map;
import java.util.Set;
import java.util.function.BiConsumer;
import java.util.function.BinaryOperator;
import java.util.function.Function;
import java.util.function.Supplier;
import java.util.stream.Collector;
import java.util.stream.Collector.Characteristics;
import org.jooq.Record;

public final class ReduceClients<S, R> implements Collector<Record, Map<Integer, S>, R> {
   private final BiConsumer<Map<Integer, S>, Record> accumulator;
   private final Function<Map<Integer, S>, R> finisher;

   public ReduceClients(BiConsumer<Map<Integer, S>, Record> accumulator, Function<Map<Integer, S>, R> finisher) {
      this.accumulator = accumulator;
      this.finisher = finisher;
   }

   @Override
   public Supplier<Map<Integer, S>> supplier() {
      return HashMap::new;
   }

   @Override
   public BiConsumer<Map<Integer, S>, Record> accumulator() {
      return this.accumulator;
   }

   @Override
   public BinaryOperator<Map<Integer, S>> combiner() {
      return (a, b) -> {
         throw new UnsupportedOperationException("parallel streams are not supported");
      };
   }

   @Override
   public Function<Map<Integer, S>, R> finisher() {
      return this.finisher;
   }

   @Override
   public Set<Characteristics> characteristics() {
      return Set.of(Characteristics.UNORDERED);
   }
}
