package com.l7tech.identity;

import com.l7tech.common.io.NonCloseableOutputStream;
import com.l7tech.objectmodel.Goid;
import com.l7tech.objectmodel.imp.NamedEntityImp;
import com.l7tech.objectmodel.migration.Migration;
import com.l7tech.objectmodel.migration.MigrationMappingSelection;
import com.l7tech.objectmodel.migration.PropertyResolver.Type;
import com.l7tech.util.Charsets;
import com.l7tech.util.PoolByteArrayOutputStream;
import com.l7tech.util.SafeXMLDecoder;
import com.l7tech.util.SafeXMLDecoderBuilder;
import jakarta.persistence.Column;
import jakarta.persistence.MappedSuperclass;
import jakarta.persistence.Transient;
import java.beans.XMLEncoder;
import java.io.ByteArrayInputStream;
import java.nio.charset.Charset;
import java.util.HashMap;
import java.util.Map;

@MappedSuperclass
public abstract class PersistentGroup extends NamedEntityImp implements Group {
   public static final Charset PROPERTIES_ENCODING = Charsets.UTF8;
   private Goid providerGoid;
   private String description;
   private transient String xmlProperties;
   private Map<String, String> properties;
   static final long serialVersionUID = -6911994604622415864L;

   public PersistentGroup() {
   }

   protected PersistentGroup(Goid var1, String var2) {
      this.providerGoid = var1;
      this._name = var2;
   }

   protected PersistentGroup(Goid var1, String var2, Map<String, String> var3) {
      this.providerGoid = var1;
      this._name = var2;
      this.properties = new HashMap<>(var3);
   }

   public synchronized void setXmlProperties(String var1) {
      if (var1 == null || !var1.equals(this.xmlProperties)) {
         this.xmlProperties = var1;
         if (var1 != null && var1.length() > 0) {
            SafeXMLDecoder var2 = new SafeXMLDecoderBuilder(new ByteArrayInputStream(var1.getBytes(PROPERTIES_ENCODING))).build();
            this.properties = (Map<String, String>)var2.readObject();
         }
      }
   }

   @Transient
   public synchronized String getXmlProperties() {
      if (this.xmlProperties == null) {
         Map var1 = this.properties;
         if (var1 == null) {
            return null;
         }

         PoolByteArrayOutputStream var2 = new PoolByteArrayOutputStream();

         try {
            XMLEncoder var3 = new XMLEncoder(new NonCloseableOutputStream(var2));
            var3.writeObject(var1);
            var3.close();
            this.xmlProperties = var2.toString(PROPERTIES_ENCODING);
         } finally {
            var2.close();
         }
      }

      return this.xmlProperties;
   }

   @Column(name = "description", length = 4096)
   @Override
   public String getDescription() {
      return this.description;
   }

   public void setDescription(String var1) {
      this.description = var1;
   }

   @Transient
   @Migration(mapName = MigrationMappingSelection.NONE, mapValue = MigrationMappingSelection.NONE, export = false, resolver = Type.ID_PROVIDER_CONFIG)
   @Override
   public Goid getProviderId() {
      return this.providerGoid;
   }

   public void setProviderId(Goid var1) {
      this.providerGoid = var1;
   }

   public void copyFrom(PersistentGroup var1) {
      this.setGoid(var1.getGoid());
      this.setName(var1.getName());
      this.setDescription(var1.getDescription());
      this.setProviderId(var1.getProviderId());
      this.setXmlProperties(var1.getXmlProperties());
   }

   @Override
   public boolean isEquivalentId(Object var1) {
      return this.getId().equals(var1.toString());
   }

   @Override
   public boolean equals(Object var1) {
      if (this == var1) {
         return true;
      }

      if (var1 == null || this.getClass() != var1.getClass()) {
         return false;
      }

      if (!super.equals(var1)) {
         return false;
      }

      PersistentGroup var2 = (PersistentGroup)var1;
      return this.providerGoid.equals(var2.providerGoid) && (this.description != null ? this.description.equals(var2.description) : var2.description == null);
   }

   @Override
   public int hashCode() {
      int var1 = super.hashCode();
      var1 = 31 * var1 + this.providerGoid.hashCode();
      return 31 * var1 + (this.description != null ? this.description.hashCode() : 0);
   }

   protected synchronized String getProperty(String var1) {
      String var2 = null;
      Map var3 = this.properties;
      if (var3 != null) {
         var2 = (String)var3.get(var1);
      }

      return var2;
   }

   protected synchronized void setProperty(String var1, String var2) {
      Map var3 = this.properties;
      if (var3 == null) {
         var3 = new HashMap();
         this.properties = var3;
      }

      var3.put(var1, var2);
      this.xmlProperties = null;
   }
}
