import { IStorageSync } from '../../../storages/types';
import { IReadinessManager } from '../../../readiness/types';
import { syncTaskFactory } from '../../syncTask';
import { ISplitsSyncTask } from '../types';
import { splitChangesFetcherFactory } from '../fetchers/splitChangesFetcher';
import { IFetchSplitChanges } from '../../../services/types';
import { ISettings } from '../../../types';
import { splitChangesUpdaterFactory } from '../updaters/splitChangesUpdater';

/**
 * Creates a sync task that periodically executes a `splitChangesUpdater` task
 */
export function splitsSyncTaskFactory(
  fetchSplitChanges: IFetchSplitChanges,
  storage: IStorageSync,
  readiness: IReadinessManager,
  settings: ISettings,
  isClientSide?: boolean
): ISplitsSyncTask {
  return syncTaskFactory(
    settings.log,
    splitChangesUpdaterFactory(
      settings.log,
      splitChangesFetcherFactory(fetchSplitChanges, settings, storage),
      storage,
      settings.sync.__splitFiltersValidation,
      readiness.splits,
      settings.startup.requestTimeoutBeforeReady,
      settings.startup.retriesOnFailureBeforeReady,
      isClientSide
    ),
    settings.scheduler.featuresRefreshRate,
    'splitChangesUpdater',
  );
}
