import {
  model,
  Model,
  modelAction,
  ModelAutoTypeCheckingMode,
  setGlobalConfig,
  tProp,
  types,
} from 'mobx-keystone';
import Scenario from './Scenario';

setGlobalConfig({
  modelAutoTypeChecking: ModelAutoTypeCheckingMode.AlwaysOn,
});
@model('keystone/Remote/Acs01/ScenarioList')
export default class ScenarioList extends Model({
  scenarios: tProp(types.array(types.model<Scenario>(Scenario)), () => []),
  defaultScenarioConfigured: tProp(types.boolean, false),
  defaultScenarioId: tProp(types.maybe(types.string)),
  defaultScenario: tProp(types.maybe(types.model<Scenario>(Scenario))),
  state: tProp(types.boolean, false),
}) {
  @modelAction
  set(scenarios: any) {
    const all: Scenario[] = [];
    for (let i = 0; i < scenarios.length; i += 1) {
      // Only save the 'veto' scenarios
      if (scenarios[i].type === 2) {
        all.push(
          new Scenario({
            id: scenarios[i].id,
            name: scenarios[i].name,
            type: scenarios[i].type,
            trigger: {
              id: scenarios[i].trigger.id,
              source: scenarios[i].trigger.source,
            },
          })
        );
      }
    }
    this.scenarios = all;
  }

  @modelAction
  setDefaultScenarioConfigured(defaultScenarioConfigured: boolean) {
    this.defaultScenarioConfigured = defaultScenarioConfigured;
  }

  @modelAction
  setDefaultScenarioId(defaultScenarioId: string | undefined) {
    this.defaultScenarioId = defaultScenarioId;
  }

  @modelAction
  setDefaultScenario(defaultScenario: any) {
    if (typeof defaultScenario === 'undefined') {
      this.defaultScenario = undefined;
    } else {
      this.defaultScenario = new Scenario({
        id: defaultScenario.id,
        name: defaultScenario.name,
        type: defaultScenario.type,
        trigger: {
          id: defaultScenario.trigger.id,
          source: defaultScenario.trigger.source,
        },
      });
    }
  }

  @modelAction
  getScenarioById(id: string | undefined) {
    return this.scenarios.find((x) => x.id === id);
  }

  @modelAction
  setState(state: boolean) {
    this.state = state;
  }

  get all() {
    const all = [];
    for (let i = 0; i < this.scenarios.length; i += 1) {
      all.push(this.scenarios[i]);
    }
    return all;
  }
}
