import Ember from 'ember';
import attr from 'ember-data/attr';
import Fragment from 'ember-data-model-fragments/fragment';

const { computed } = Ember;
const { match } = computed;

export default Fragment.extend({
  clusterId: attr('string'),
  clusterIdDisplay: computed('mode', function() {
    const clusterId = this.get('clusterId');
    return clusterId ? clusterId.split('-')[0] : null;
  }),
  mode: attr('string'),
  replicationDisabled: match('mode', /disabled|unsupported/),
  replicationUnsupported: match('mode', /unsupported/),
  replicationEnabled: computed.not('replicationDisabled'),

  // primary attrs
  isPrimary: match('mode', /primary/),

  knownSecondaries: attr('array'),

  // secondary attrs
  isSecondary: match('mode', /secondary/),

  modeForUrl: computed('mode', function() {
    const mode = this.get('mode');
    return mode === 'bootstrapping'
      ? 'bootstrapping'
      : (this.get('isSecondary') && 'secondary') || (this.get('isPrimary') && 'primary');
  }),
  secondaryId: attr('string'),
  primaryClusterAddr: attr('string'),
  knownPrimaryClusterAddrs: attr('array'),
  state: attr('string'), //stream-wal, merkle-diff, merkle-sync, idle
  lastRemoteWAL: attr('number'),

  // attrs on primary and secondary
  lastWAL: attr('number'),
  merkleRoot: attr('string'),
  merkleSyncProgress: attr('object'),
  syncProgress: computed('state', 'merkleSyncProgress', function() {
    const { state, merkleSyncProgress } = this.getProperties('state', 'merkleSyncProgress');
    if (state !== 'merkle-sync' || !merkleSyncProgress) {
      return null;
    }
    const { sync_total_keys, sync_progress } = merkleSyncProgress;
    return {
      progress: sync_progress,
      total: sync_total_keys,
    };
  }).volatile(),

  syncProgressPercent: computed('syncProgress', function() {
    const syncProgress = this.get('syncProgress');
    if (!syncProgress) {
      return null;
    }
    const { progress, total } = syncProgress;

    return Math.floor(100 * (progress / total));
  }),

  modeDisplay: computed('mode', function() {
    const displays = {
      disabled: 'Disabled',
      unknown: 'Unknown',
      bootstrapping: 'Bootstrapping',
      primary: 'Primary',
      secondary: 'Secondary',
      unsupported: 'Not supported',
    };

    return displays[this.get('mode')] || 'Disabled';
  }),
});
