package com.airlock.iam.admin.domain.model.analytics;

import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
import java.time.Instant;
import java.util.Optional;
import lombok.NonNull;

public record Analytics(
   @NonNull String iamVersion,
   @NonNull LicenseAnalytics license,
   int userCount,
   boolean usageAnalyticsEnabled,
   boolean runningInDocker,
   @NonNull Instant createdAt,
   @NonNull Optional<UsageAnalytics> usageData
) {
   @SuppressFBWarnings(justification = "generated code")
   public Analytics {
      if (iamVersion == null) {
         throw new NullPointerException("iamVersion is marked non-null but is null");
      }

      if (license == null) {
         throw new NullPointerException("license is marked non-null but is null");
      }

      if (createdAt == null) {
         throw new NullPointerException("createdAt is marked non-null but is null");
      }

      if (usageData == null) {
         throw new NullPointerException("usageData is marked non-null but is null");
      }
   }

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

   @SuppressFBWarnings(justification = "generated code")
   public Analytics.AnalyticsBuilder toBuilder() {
      return new Analytics.AnalyticsBuilder()
         .iamVersion(this.iamVersion)
         .license(this.license)
         .userCount(this.userCount)
         .usageAnalyticsEnabled(this.usageAnalyticsEnabled)
         .runningInDocker(this.runningInDocker)
         .createdAt(this.createdAt)
         .usageData(this.usageData);
   }

   @SuppressFBWarnings(justification = "generated code")
   public static class AnalyticsBuilder {
      @SuppressFBWarnings(justification = "generated code")
      private String iamVersion;
      @SuppressFBWarnings(justification = "generated code")
      private LicenseAnalytics license;
      @SuppressFBWarnings(justification = "generated code")
      private int userCount;
      @SuppressFBWarnings(justification = "generated code")
      private boolean usageAnalyticsEnabled;
      @SuppressFBWarnings(justification = "generated code")
      private boolean runningInDocker;
      @SuppressFBWarnings(justification = "generated code")
      private Instant createdAt;
      @SuppressFBWarnings(justification = "generated code")
      private Optional<UsageAnalytics> usageData;

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

      @SuppressFBWarnings(justification = "generated code")
      public Analytics.AnalyticsBuilder iamVersion(@NonNull String iamVersion) {
         if (iamVersion == null) {
            throw new NullPointerException("iamVersion is marked non-null but is null");
         }

         this.iamVersion = iamVersion;
         return this;
      }

      @SuppressFBWarnings(justification = "generated code")
      public Analytics.AnalyticsBuilder license(@NonNull LicenseAnalytics license) {
         if (license == null) {
            throw new NullPointerException("license is marked non-null but is null");
         }

         this.license = license;
         return this;
      }

      @SuppressFBWarnings(justification = "generated code")
      public Analytics.AnalyticsBuilder userCount(int userCount) {
         this.userCount = userCount;
         return this;
      }

      @SuppressFBWarnings(justification = "generated code")
      public Analytics.AnalyticsBuilder usageAnalyticsEnabled(boolean usageAnalyticsEnabled) {
         this.usageAnalyticsEnabled = usageAnalyticsEnabled;
         return this;
      }

      @SuppressFBWarnings(justification = "generated code")
      public Analytics.AnalyticsBuilder runningInDocker(boolean runningInDocker) {
         this.runningInDocker = runningInDocker;
         return this;
      }

      @SuppressFBWarnings(justification = "generated code")
      public Analytics.AnalyticsBuilder createdAt(@NonNull Instant createdAt) {
         if (createdAt == null) {
            throw new NullPointerException("createdAt is marked non-null but is null");
         }

         this.createdAt = createdAt;
         return this;
      }

      @SuppressFBWarnings(justification = "generated code")
      public Analytics.AnalyticsBuilder usageData(@NonNull Optional<UsageAnalytics> usageData) {
         if (usageData == null) {
            throw new NullPointerException("usageData is marked non-null but is null");
         }

         this.usageData = usageData;
         return this;
      }

      @SuppressFBWarnings(justification = "generated code")
      public Analytics build() {
         return new Analytics(this.iamVersion, this.license, this.userCount, this.usageAnalyticsEnabled, this.runningInDocker, this.createdAt, this.usageData);
      }

      @SuppressFBWarnings(justification = "generated code")
      @Override
      public String toString() {
         return "Analytics.AnalyticsBuilder(iamVersion="
            + this.iamVersion
            + ", license="
            + this.license
            + ", userCount="
            + this.userCount
            + ", usageAnalyticsEnabled="
            + this.usageAnalyticsEnabled
            + ", runningInDocker="
            + this.runningInDocker
            + ", createdAt="
            + this.createdAt
            + ", usageData="
            + this.usageData
            + ")";
      }
   }
}
