package com.airbnb.lottie;

import androidx.annotation.NonNull;
import androidx.annotation.Nullable;

import com.airbnb.lottie.network.LottieNetworkCacheProvider;
import com.airbnb.lottie.network.LottieNetworkFetcher;

import java.io.File;

/**
 * Class for custom library configuration.
 * <p>
 * This should be constructed with {@link LottieConfig.Builder}
 */
public class LottieConfig {

  @Nullable final LottieNetworkFetcher networkFetcher;
  @Nullable final LottieNetworkCacheProvider cacheProvider;
  final boolean enableSystraceMarkers;
  final boolean enableNetworkCache;
  final boolean disablePathInterpolatorCache;
  final AsyncUpdates defaultAsyncUpdates;

  private LottieConfig(@Nullable LottieNetworkFetcher networkFetcher, @Nullable LottieNetworkCacheProvider cacheProvider,
      boolean enableSystraceMarkers, boolean enableNetworkCache, boolean disablePathInterpolatorCache,
      AsyncUpdates defaultAsyncUpdates) {
    this.networkFetcher = networkFetcher;
    this.cacheProvider = cacheProvider;
    this.enableSystraceMarkers = enableSystraceMarkers;
    this.enableNetworkCache = enableNetworkCache;
    this.disablePathInterpolatorCache = disablePathInterpolatorCache;
    this.defaultAsyncUpdates = defaultAsyncUpdates;
  }

  public static final class Builder {

    @Nullable
    private LottieNetworkFetcher networkFetcher;
    @Nullable
    private LottieNetworkCacheProvider cacheProvider;
    private boolean enableSystraceMarkers = false;
    private boolean enableNetworkCache = true;
    private boolean disablePathInterpolatorCache = true;
    private AsyncUpdates defaultAsyncUpdates = AsyncUpdates.AUTOMATIC;

    /**
     * Lottie has a default network fetching stack built on {@link java.net.HttpURLConnection}. However, if you would like to hook into your own
     * network stack for performance, caching, or analytics, you may replace the internal stack with your own.
     */
    @NonNull
    public Builder setNetworkFetcher(@NonNull LottieNetworkFetcher fetcher) {
      this.networkFetcher = fetcher;
      return this;
    }

    /**
     * Provide your own network cache directory. By default, animations will be saved in your application's cacheDir/lottie_network_cache.
     *
     * @see #setNetworkCacheProvider(LottieNetworkCacheProvider)
     */
    @NonNull
    public Builder setNetworkCacheDir(@NonNull final File file) {
      if (cacheProvider != null) {
        throw new IllegalStateException("There is already a cache provider!");
      }
      cacheProvider = new LottieNetworkCacheProvider() {
        @Override @NonNull public File getCacheDir() {
          if (!file.isDirectory()) {
            throw new IllegalArgumentException("cache file must be a directory");
          }
          return file;
        }
      };
      return this;
    }

    /**
     * Provide your own network cache provider. By default, animations will be saved in your application's cacheDir/lottie_network_cache.
     */
    @NonNull
    public Builder setNetworkCacheProvider(@NonNull final LottieNetworkCacheProvider fileCacheProvider) {
      if (cacheProvider != null) {
        throw new IllegalStateException("There is already a cache provider!");
      }
      cacheProvider = new LottieNetworkCacheProvider() {
        @NonNull @Override public File getCacheDir() {
          File file = fileCacheProvider.getCacheDir();
          if (!file.isDirectory()) {
            throw new IllegalArgumentException("cache file must be a directory");
          }
          return file;
        }
      };
      return this;
    }

    /**
     * Enable this if you want to run systrace to debug the performance of animations.
     * <p/>
     * DO NOT leave this enabled in production. The overhead is low but non-zero.
     *
     * @see <a href="https://developer.android.com/topic/performance/tracing/command-line">Systrace Docs</a>
     */
    @NonNull
    public Builder setEnableSystraceMarkers(boolean enable) {
      enableSystraceMarkers = enable;
      return this;
    }

    /**
     * Disable this if you want to completely disable internal Lottie cache for retrieving network animations.
     * Internal network cache is enabled by default.
     */
    @NonNull
    public Builder setEnableNetworkCache(boolean enable) {
      enableNetworkCache = enable;
      return this;
    }

    /**
     * When parsing animations, Lottie has a path interpolator cache. This cache allows Lottie to reuse PathInterpolators
     * across an animation. This is desirable in most cases. However, when shared across screenshot tests, it can cause slight
     * deviations in the rendering due to underlying approximations in the PathInterpolator.
     *
     * The cache is enabled by default and should probably only be disabled for screenshot tests.
     */
    @NonNull
    public Builder setDisablePathInterpolatorCache(boolean disable) {
      disablePathInterpolatorCache = disable;
      return this;
    }

    /**
     * Sets the default value for async updates.
     * @see LottieDrawable#setAsyncUpdates(AsyncUpdates)
     */
    @NonNull
    public Builder setDefaultAsyncUpdates(AsyncUpdates asyncUpdates) {
      defaultAsyncUpdates = asyncUpdates;
      return this;
    }

    @NonNull
    public LottieConfig build() {
      return new LottieConfig(networkFetcher, cacheProvider, enableSystraceMarkers, enableNetworkCache, disablePathInterpolatorCache,
          defaultAsyncUpdates);
    }
  }
}
