import { atom, selector } from 'recoil';
import { merge, keyBy } from 'lodash';
import { remote } from 'electron';

import { modsText } from '../../helpers/static-text';
import { settingsState } from '../settings-state';

export const remoteModList = atom<Mod[]>({
  key: 'RemoteModList',
  default: [],
});

export const localModList = atom<Mod[]>({
  key: 'LocalModList',
  default: [],
});

export const modManager = atom<ModManager>({
  key: 'ModManager',
  default: {
    downloadCount: 0,
  },
});

function regularFilter(mod: Mod) {
  return Boolean(!mod.isAlpha);
}

function alphaFilter(mod: Mod) {
  return Boolean(mod.isAlpha);
}

const remoteModMap = selector({
  key: 'RemoteModMap',
  get: ({ get }) => {
    const filter = get(settingsState).alphaMode ? alphaFilter : regularFilter;
    return keyBy(get(remoteModList).filter(filter), 'uniqueName');
  },
});

export const localModMap = selector({
  key: 'LocalModMap',
  get: ({ get }) => {
    const filter = get(settingsState).alphaMode ? alphaFilter : regularFilter;
    return keyBy(get(localModList).filter(filter), 'uniqueName');
  },
});

const modMapState = selector({
  key: 'ModMap',
  get: ({ get }) =>
    merge<ModMap, ModMap, ModMap>({}, get(remoteModMap), get(localModMap)),
});

export const modList = selector({
  key: 'ModList',
  get: ({ get }) => {
    return Object.values(get(modMapState)).concat({
      ...modsText.modManager,
      uniqueName: 'ow-mod-manager',
      isRequired: true,
      isEnabled: true,
      localVersion: remote.app.getVersion(),
      remoteVersion: remote.app.getVersion(),
      repo: 'https://github.com/Raicuparta/ow-mod-manager',
      modPath: '.',
      downloadUrl: '',
      downloadCount: get(modManager).downloadCount,
      errors: [],
      dependencies: [],
      addons: [],
      isAlpha: get(settingsState).alphaMode,
    });
  },
});