package com.airlock.iam.flow.shared.domain.model.session;

import com.airlock.iam.base.api.domain.model.exception.ViolationException;
import com.airlock.iam.base.api.domain.model.mapification.MapifiedValues;
import com.airlock.iam.base.domain.model.mapification.MapifiedValuesBuilder;
import com.airlock.iam.base.domain.service.uri.UrlUtils;
import com.airlock.iam.flow.shared.api.domain.model.session.UserSessionScopedFlowAttribute;
import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
import java.util.Arrays;
import java.util.Map;
import java.util.Optional;
import java.util.Set;
import java.util.stream.Collectors;

public final class ProcessedRemovedRolesAttribute implements UserSessionScopedFlowAttribute<ProcessedRemovedRolesAttribute> {
   private static final String KEY = "processedRoles";
   private final ProcessedRemovedRoles processedRemovedRoles;

   public ProcessedRemovedRolesAttribute mergeWith(ProcessedRemovedRolesAttribute newAttribute) {
      throw new ViolationException("Merging of ProcessedRemovedRolesAttribute not possible");
   }

   public ProcessedRemovedRolesAttribute copyAttribute() {
      return new ProcessedRemovedRolesAttribute(new ProcessedRemovedRoles(this.processedRemovedRoles.getProcessed()));
   }

   @Override
   public MapifiedValues mapify() {
      return MapifiedValuesBuilder.mapifiedValues().putIfNotEmpty("processedRoles", this.processedRemovedRoles.getProcessed()).build();
   }

   public static ProcessedRemovedRolesAttribute demapify(MapifiedValues values) {
      return new ProcessedRemovedRolesAttribute(new ProcessedRemovedRoles(values.demapifySimpleSet("processedRoles", String.class::cast)));
   }

   public static ProcessedRemovedRolesAttribute deserializeSessionAttribute(Map<String, String> rawValues) {
      Set<String> processed = Optional.ofNullable(rawValues.get("processedRoles"))
         .map(enc -> enc.split("&"))
         .stream()
         .flatMap(Arrays::stream)
         .map(UrlUtils::urlDecode)
         .collect(Collectors.toSet());
      return new ProcessedRemovedRolesAttribute(new ProcessedRemovedRoles(processed));
   }

   @SuppressFBWarnings(justification = "generated code")
   public ProcessedRemovedRolesAttribute(ProcessedRemovedRoles processedRemovedRoles) {
      this.processedRemovedRoles = processedRemovedRoles;
   }

   @SuppressFBWarnings(justification = "generated code")
   public ProcessedRemovedRoles getProcessedRemovedRoles() {
      return this.processedRemovedRoles;
   }

   @SuppressFBWarnings(justification = "generated code")
   @Override
   public boolean equals(Object o) {
      if (o == this) {
         return true;
      } else if (!(o instanceof ProcessedRemovedRolesAttribute other)) {
         return false;
      } else {
         Object this$processedRemovedRoles = this.processedRemovedRoles;
         Object other$processedRemovedRoles = other.processedRemovedRoles;
         return this$processedRemovedRoles == null ? other$processedRemovedRoles == null : this$processedRemovedRoles.equals(other$processedRemovedRoles);
      }
   }

   @SuppressFBWarnings(justification = "generated code")
   @Override
   public int hashCode() {
      int PRIME = 59;
      int result = 1;
      Object $processedRemovedRoles = this.processedRemovedRoles;
      return result * 59 + ($processedRemovedRoles == null ? 43 : $processedRemovedRoles.hashCode());
   }

   @SuppressFBWarnings(justification = "generated code")
   @Override
   public String toString() {
      return "ProcessedRemovedRolesAttribute(processedRemovedRoles=" + this.getProcessedRemovedRoles() + ")";
   }
}
