package com.airlock.iam.admin.application.configuration.analytics;

import com.airlock.iam.core.misc.util.config.ActiveLicenseEnvironment;
import com.airlock.iam.plugin.api.annotation.config.Plugin;
import com.airlock.iam.plugin.api.annotation.lifecycle.AfterConfigActivation;
import com.airlock.iam.plugin.api.annotation.property.BooleanProperty;
import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;

@Plugin(
   description = "<p><b>This plugin securely transmits both License and Usage Analytics</b> to an Airlock cloud service.</p>\n<p><b>License Analytics</b> is always enabled and must be transmitted regularly, as per our terms and conditions. It includes:</p>\n<ul>\n\t<li>License information from license.txt</li>\n\t<li>The current IAM version</li>\n\t<li>The number of users in the database</li>\n\t<li>Whether IAM is running in a docker container</li>\n\t<li>The status of the \"Enable Usage Analytics\" property</li>\n</ul>\n<p><b>Usage Analytics</b> is only sent if the \"Enable Usage Analytics\" property is enabled. Refer to that property’s documentation for details.</p>\n<p>For review, the transferred data is also stored in plaintext in \"iam/instances/{instance-name}/usage/usage-data.json\"</p>\n",
   displayName = "License and Usage Analytics"
)
public class LicenseAnalyticsConfig {
   @BooleanProperty(
      description = "<p><b>Enabling this property</b> grants consent to transfer <b>Usage Analytics</b> to the Airlock cloud service <b>in addition</b> to License Analytics.</p>\n<p>The following information is included:</p>\n<ul>\n\t<li>Redacted IAM config</li>\n\t<li>Redacted instance config</li>\n\t<li>Database schema information</li>\n\t<li>IAM metrics</li>\n</ul>\n<p>Currently, only the 'Redacted IAM config' is transmitted. The remaining items will follow in upcoming releases. </p>\n<p>Redacted means that all potentially sensitive or irrelevant data has been removed or replaced by placeholders.</p>\n",
      optional = true,
      defaultValue = "true",
      displayName = "Enable Usage Analytics"
   )
   private boolean enableUsageAnalytics;
   private boolean analyticsPermitted;

   @AfterConfigActivation
   void loadAnalyticsPermissionSetting() {
      this.analyticsPermitted = ActiveLicenseEnvironment.getAnalyticsPermissionSetting();
   }

   public boolean isEnableUsageAnalytics() {
      return this.enableUsageAnalytics;
   }

   public boolean isAnalyticsPermitted() {
      return this.analyticsPermitted;
   }

   @SuppressFBWarnings(justification = "generated code")
   public static LicenseAnalyticsConfig.LicenseAnalyticsConfigBuilder builder() {
      return new LicenseAnalyticsConfig.LicenseAnalyticsConfigBuilder();
   }

   @SuppressFBWarnings(justification = "generated code")
   public LicenseAnalyticsConfig() {
   }

   @SuppressFBWarnings(justification = "generated code")
   public LicenseAnalyticsConfig(boolean enableUsageAnalytics, boolean analyticsPermitted) {
      this.enableUsageAnalytics = enableUsageAnalytics;
      this.analyticsPermitted = analyticsPermitted;
   }

   @SuppressFBWarnings(justification = "generated code")
   public static class LicenseAnalyticsConfigBuilder {
      @SuppressFBWarnings(justification = "generated code")
      private boolean enableUsageAnalytics;
      @SuppressFBWarnings(justification = "generated code")
      private boolean analyticsPermitted;

      @SuppressFBWarnings(justification = "generated code")
      LicenseAnalyticsConfigBuilder() {
      }

      @SuppressFBWarnings(justification = "generated code")
      public LicenseAnalyticsConfig.LicenseAnalyticsConfigBuilder enableUsageAnalytics(boolean enableUsageAnalytics) {
         this.enableUsageAnalytics = enableUsageAnalytics;
         return this;
      }

      @SuppressFBWarnings(justification = "generated code")
      public LicenseAnalyticsConfig.LicenseAnalyticsConfigBuilder analyticsPermitted(boolean analyticsPermitted) {
         this.analyticsPermitted = analyticsPermitted;
         return this;
      }

      @SuppressFBWarnings(justification = "generated code")
      public LicenseAnalyticsConfig build() {
         return new LicenseAnalyticsConfig(this.enableUsageAnalytics, this.analyticsPermitted);
      }

      @SuppressFBWarnings(justification = "generated code")
      @Override
      public String toString() {
         return "LicenseAnalyticsConfig.LicenseAnalyticsConfigBuilder(enableUsageAnalytics="
            + this.enableUsageAnalytics
            + ", analyticsPermitted="
            + this.analyticsPermitted
            + ")";
      }
   }
}
