import { ReflectionMutableCommandProccessingAggregate } from "../ReflectionMutableCommandProccessingAggregate";

import TestCommand, {
  CreateTest,
  RenameTest,
  ChangeStatusTest
} from "./TestCommand";
import {
  TestCreated,
  TestRenamed,
  TestEvent,
  TestStatusChanged
} from "./TestCreated";

export interface TestDetail {
  id: string;
  name: string;
}

export class Test implements ReflectionMutableCommandProccessingAggregate {
  private id: string;
  private name: string;
  private status: number = 0;
  constructor() {}
  getID() {
    return this.id;
  }
  getName() {
    return this.name;
  }
  apply(event: TestEvent): void {
    console.log(event);
    switch (event.event_type) {
      case "TestCreated":
        this.id = event.entity_id;
        this.name = event.event_data.name;
        return;
      case "TestRenamed":
        this.name = event.event_data;
        break;
      case "TestStatusChanged":
        this.status = event.event_data;
        break;
    }
  }

  process(command: TestCommand): TestEvent[] {
    if (command instanceof CreateTest) {
      command.entity.id = command.entity_id;
      return [
        new TestCreated({
          event_data: command.entity,
          entity_type: this.constructor.name,
          entity_id: command.entity_id,
          triggering_event: null
        })
      ];
    }
    if (command instanceof RenameTest) {
      return [
        new TestRenamed({
          event_data: command.entity,
          entity_type: this.constructor.name,
          entity_id: command.entity_id,
          triggering_event: null
        })
      ];
    }
    if (command instanceof ChangeStatusTest) {
      return [
        new TestStatusChanged({
          event_data: command.entity,
          entity_type: this.constructor.name,
          entity_id: command.entity_id,
          triggering_event: null
        })
      ];
    }
  }
}
