import { Observable } from 'rxjs';
import BroadcastChannelSender from 'src/services/backend/channels/BroadcastChannelSender';
import DbApiWrapper from 'src/services/backend/services/DbApi/DbApi';
import rune from 'src/services/scripting/engine';
import runeDeps, { RuneInnerDeps } from 'src/services/scripting/runeDeps';
import { EmbeddingApi } from './mlApi';

// eslint-disable-next-line import/no-unused-modules, import/prefer-default-export
export const createRuneApi = (
  embeddingApi$: Observable<EmbeddingApi>,
  dbInstance$: Observable<DbApiWrapper>,
  broadcastApi: BroadcastChannelSender
) => {
  const setInnerDeps = (deps: Partial<RuneInnerDeps>) => runeDeps.setInnerDeps(deps);

  embeddingApi$.subscribe((embeddingApi) => {
    setInnerDeps({ embeddingApi });
  });

  dbInstance$.subscribe((dbApi) => {
    setInnerDeps({ dbApi });
  });

  rune.isSoulInitialized$.subscribe((value) => {
    value
      ? setTimeout(() => broadcastApi.postServiceStatus('rune', 'started'), 0)
      : broadcastApi.postServiceStatus('rune', 'inactive');
  });

  const init = async () => {
    broadcastApi.postServiceStatus('rune', 'starting');

    await rune.init();
    setInnerDeps({ rune });
  };

  init();

  return { rune, setInnerDeps, abort: runeDeps.abort };
};

Neighbours