package com.l7tech.policy.assertion;

import com.l7tech.policy.variable.Syntax;
import com.l7tech.policy.variable.VariableMetadata;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Set;
import java.util.TreeSet;

public class VariableUseSupport {
   public static VariableUseSupport.VariablesUsed expressions(String... var0) {
      return new VariableUseSupport.VariablesUsed().withExpressions(var0);
   }

   public static VariableUseSupport.VariablesUsed variables(String... var0) {
      return new VariableUseSupport.VariablesUsed().withVariables(var0);
   }

   public static VariableUseSupport.VariablesSet variables(VariableMetadata... var0) {
      return new VariableUseSupport.VariablesSet().withVariables(var0);
   }

   public static final class VariablesSet extends VariableUseSupport.VariablesSetSupport<VariableUseSupport.VariablesSet> {
      protected VariablesSet() {
      }

      protected VariableUseSupport.VariablesSet get() {
         return this;
      }
   }

   public abstract static class VariablesSetSupport<VSS extends VariableUseSupport.VariablesSetSupport<VSS>> {
      private final List<VariableMetadata> a = new ArrayList<>();

      protected VariablesSetSupport() {
      }

      protected VariablesSetSupport(VariableMetadata[] var1) {
         this.addVariables(var1);
      }

      public final void addVariables(VariableMetadata... var1) {
         if (var1 != null) {
            for (VariableMetadata var5 : var1) {
               if (var5 != null) {
                  this.a.add(var5);
               }
            }
         }
      }

      public final void add(VariableUseSupport.VariablesSetSupport<?> var1) {
         if (var1 != null) {
            this.a.addAll(var1.a);
         }
      }

      public final VSS withVariables(VariableMetadata... var1) {
         this.addVariables(var1);
         return this.get();
      }

      public final VSS with(VariableUseSupport.VariablesSetSupport<?> var1) {
         this.add(var1);
         return this.get();
      }

      public final VariableMetadata[] asArray() {
         return this.a.toArray(new VariableMetadata[this.a.size()]);
      }

      protected abstract VSS get();
   }

   public static final class VariablesUsed extends VariableUseSupport.VariablesUsedSupport<VariableUseSupport.VariablesUsed> {
      protected VariablesUsed() {
      }

      protected VariableUseSupport.VariablesUsed get() {
         return this;
      }
   }

   public abstract static class VariablesUsedSupport<VUS extends VariableUseSupport.VariablesUsedSupport<VUS>> {
      private final Set<String> a = new TreeSet<>(String.CASE_INSENSITIVE_ORDER);

      protected VariablesUsedSupport() {
      }

      protected VariablesUsedSupport(String[] var1) {
         this.addVariables(var1);
      }

      public final void addExpressions(String... var1) {
         if (var1 != null) {
            this.addExpressions(Arrays.asList(var1));
         }
      }

      public final void addExpressions(Iterable<String> var1) {
         if (var1 != null) {
            for (String var3 : var1) {
               this.addVariables(Syntax.getReferencedNames(var3));
            }
         }
      }

      public final void addVariables(String... var1) {
         if (var1 != null) {
            this.addVariables(Arrays.asList(var1));
         }
      }

      public final void addVariables(Iterable<String> var1) {
         if (var1 != null) {
            for (String var3 : var1) {
               if (var3 != null && !var3.isEmpty()) {
                  this.a.add(var3);
               }
            }
         }
      }

      public final void add(VariableUseSupport.VariablesUsedSupport<?> var1) {
         if (var1 != null) {
            this.a.addAll(var1.a);
         }
      }

      public final VUS withExpressions(String... var1) {
         this.addExpressions(var1);
         return this.get();
      }

      public final VUS withExpressions(Iterable<String> var1) {
         this.addExpressions(var1);
         return this.get();
      }

      public final VUS withVariables(String... var1) {
         this.addVariables(var1);
         return this.get();
      }

      public final VUS withVariables(Iterable<String> var1) {
         this.addVariables(var1);
         return this.get();
      }

      public final VUS with(VariableUseSupport.VariablesUsedSupport<?> var1) {
         this.add(var1);
         return this.get();
      }

      public final String[] asArray() {
         return this.a.toArray(new String[this.a.size()]);
      }

      protected abstract VUS get();
   }
}
