package com.l7tech.external.assertions.gatewaygraphql.server.resolver.helper;

import com.l7tech.common.io.CertGenParams;
import com.l7tech.common.io.CertUtils;
import com.l7tech.common.io.UnsupportedX509GeneralNameException;
import com.l7tech.common.io.X509GeneralName;
import com.l7tech.external.assertions.gatewaygraphql.server.data.CSRParamsInput;
import com.l7tech.external.assertions.gatewaygraphql.server.data.HashAlgorithm;
import com.l7tech.external.assertions.gatewaygraphql.server.data.KeyCSRDTO;
import com.l7tech.external.assertions.gatewaygraphql.server.data.KeyCertChainDTO;
import com.l7tech.external.assertions.gatewaygraphql.server.data.SignatureAlgorithm;
import com.l7tech.external.assertions.gatewaygraphql.server.input.EntityPropertyInput;
import com.l7tech.gateway.common.security.keystore.SsgKeyEntry;
import com.l7tech.objectmodel.FindException;
import com.l7tech.objectmodel.Goid;
import com.l7tech.objectmodel.PersistentEntity;
import com.l7tech.server.security.keystore.SsgKeyFinder;
import com.l7tech.server.security.keystore.SsgKeyStore;
import com.l7tech.server.security.keystore.SsgKeyStoreManager;
import com.l7tech.util.Charsets;
import com.l7tech.util.Config;
import com.l7tech.util.ConfigFactory;
import com.l7tech.util.ExceptionUtils;
import com.l7tech.util.NameValuePair;
import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.security.KeyStoreException;
import java.security.cert.CertificateEncodingException;
import java.security.cert.CertificateException;
import java.security.cert.CertificateFactory;
import java.security.cert.X509Certificate;
import java.time.ZoneId;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.security.auth.x500.X500Principal;
import lombok.Generated;

public class KeyCertManagementHelper {
   @Generated
   private static final Logger a;
   private final SsgKeyStoreManager b;
   private final Config c;
   private static final int d;
   private static final String[] e;

   public KeyCertManagementHelper(SsgKeyStoreManager var1, Config var2) {
      this.b = var1;
      this.c = var2;
   }

   private List<X509GeneralName> a(List<EntityPropertyInput> var1) throws UnsupportedX509GeneralNameException {
      ArrayList var2 = new ArrayList();
      if (var1 != null) {
         for (EntityPropertyInput var4 : var1) {
            var2.add(CertUtils.convertToX509GeneralName(new NameValuePair(var4.getName(), var4.getValue())));
         }
      }

      return var2;
   }

   public SsgKeyStore getSsgKeyStore(Goid var1) throws FindException, KeyStoreException {
      try {
         SsgKeyFinder var2 = this.b.findByPrimaryKey(var1);
         return var2.getKeyStore();
      } catch (KeyStoreException | FindException var4) {
         a.log(Level.WARNING, e[2] + ExceptionUtils.getMessage(var4) + "'", ExceptionUtils.getDebugException(var4));
         throw var4;
      }
   }

   public SsgKeyEntry getSsgKeyEntry(Goid var1, String var2) throws FindException, KeyStoreException {
      try {
         SsgKeyEntry var3;
         if (Goid.isDefault(var1)) {
            var3 = this.b.lookupKeyByKeyAlias(var2, PersistentEntity.DEFAULT_GOID);
         } else {
            SsgKeyFinder var4 = this.b.findByPrimaryKey(var1);
            var3 = var4.getCertificateChain(var2);
         }

         return var3;
      } catch (KeyStoreException | FindException var5) {
         a.log(Level.WARNING, () -> e[3] + var5.getMessage());
         throw var5;
      }
   }

   public CertGenParams getCertSignParams(KeyCertChainDTO.CSRSignParamsInput var1) {
      return this.a(var1, null);
   }

   public List<String> getCertificateChain(X509Certificate var1, X509Certificate[] var2) throws CertificateEncodingException, IOException {
      X509Certificate[] var3 = new X509Certificate[var2.length + 1];
      var3[0] = var1;
      System.arraycopy(var2, 0, var3, 1, var2.length);
      ArrayList var4 = new ArrayList();

      for (X509Certificate var8 : var3) {
         var4.add(CertUtils.encodeAsPEM(var8));
      }

      return var4;
   }

   public X509Certificate[] getCertificateChain(List<String> var1) throws CertificateException {
      CertificateFactory var2 = CertUtils.getFactory();
      X509Certificate[] var3 = new X509Certificate[var1.size()];
      int var4 = 0;

      for (String var6 : var1) {
         var3[var4] = (X509Certificate)var2.generateCertificate(new ByteArrayInputStream(var6.getBytes(Charsets.UTF8)));
         var4++;
      }

      return var3;
   }

   public CertGenParams getCSRGenerateParams(KeyCSRDTO.CSRGenerateParamsInput var1, String var2) throws UnsupportedX509GeneralNameException {
      CertGenParams var3 = this.a(var1, var2);
      List var4 = this.a(var1.getSubjectAlternativeNames());
      var3.setSubjectAlternativeNames(var4);
      return var3;
   }

   private CertGenParams a(CSRParamsInput var1, String var2) {
      String var3 = var1.getSubjectDn() != null ? var1.getSubjectDn() : var2;
      X500Principal var4 = var3 != null ? new X500Principal(var3) : null;
      HashAlgorithm var5 = var1.getHashAlgorithm();
      String var6 = var5 != null ? var5.toString() : null;
      SignatureAlgorithm var7 = var1.getSignatureAlgorithm();
      String var8 = var7 != null ? var7.getValue() : null;
      Integer var9 = var1.getExpiryAge() != null ? var1.getExpiryAge() : this.c.getIntProperty(e[0], d);
      CertGenParams var10 = new CertGenParams(var4, var9, false, var8);
      if (var1.getNotBefore() != null) {
         var10.setNotBefore(Date.from(var1.getNotBefore().atStartOfDay(ZoneId.systemDefault()).toInstant()));
      }

      var10.setHashAlgorithm(var6);
      return var10;
   }

   static {
      String[] var5 = new String[4];
      int var3 = 0;
      String var2 = ":#Y\u0013\u0017\u0017\n8fT\u000e_\u0015\f&<u\u0013I\u001d\u000b3\tW\u000eE)']EUC\r/+XE\\\f\r/:^\nUZ\u00189;U\u0019M\u001d\u0016$;\u001e\fX\u0000\u001c=)I\u0006X\u001a\u0018--]\u000eW\u0000W.-V\nL\u0018\r\t;B.A\u0004\u001081t\n@\u0007";
      int var4 = ":#Y\u0013\u0017\u0017\n8fT\u000e_\u0015\f&<u\u0013I\u001d\u000b3\tW\u000eE)']EUC\r/+XE\\\f\r/:^\nUZ\u00189;U\u0019M\u001d\u0016$;\u001e\fX\u0000\u001c=)I\u0006X\u001a\u0018--]\u000eW\u0000W.-V\nL\u0018\r\t;B.A\u0004\u001081t\n@\u0007"
         .length();
      char var1 = 25;
      int var7 = -1;

      label24:
      while (true) {
         byte var10000 = 59;
         String var10001 = var2.substring(++var7, var7 + var1);
         byte var10002 = -1;

         while (true) {
            String var8 = a(var10000, a(var10001));
            switch (var10002) {
               case 0:
                  var5[var3++] = var8;
                  if ((var7 += var1) >= var4) {
                     e = var5;
                     a = Logger.getLogger(KeyCertManagementHelper.class.getName());
                     d = ConfigFactory.getIntProperty(e[1], 730);
                     return;
                  }

                  var1 = var2.charAt(var7);
                  break;
               default:
                  var5[var3++] = var8;
                  if ((var7 += var1) < var4) {
                     var1 = var2.charAt(var7);
                     continue label24;
                  }

                  var2 = "xM5s<#o^\\\"o=j`Z\u001f,y7pzRM\"<i\u0010vZ><'p.PV4o'mi\u0007\u001f";
                  var4 = "xM5s<#o^\\\"o=j`Z\u001f,y7pzRM\"<i\u0010vZ><'p.PV4o'mi\u0007\u001f".length();
                  var1 = 26;
                  var7 = -1;
            }

            var10000 = 76;
            var10001 = var2.substring(++var7, var7 + var1);
            var10002 = 0;
         }
      }
   }

   private static char[] a(String var0) {
      char[] var10000 = var0.toCharArray();
      if (var10000.length < 2) {
         var10000[0] = (char)(var10000[0] ^ 66);
      }

      return var10000;
   }

   private static String a(int var0, char[] var1) {
      int var10003 = var1.length;
      int var10002 = var0;
      char[] var10001 = var1;
      int var10000 = var10003;

      for (int var2 = 0; var10000 > var2; var2++) {
         var10001[var2] = (char)(var10001[var2] ^ var10002 ^ switch (var2 % 7) {
            case 0 -> 113;
            case 1 -> 115;
            case 2 -> 11;
            case 3 -> 80;
            case 4 -> 2;
            case 5 -> 79;
            default -> 66;
         });
      }

      return new String(var10001).intern();
   }
}
