import {ModelDefinition} from './BaseModels';
import {Asset} from './Asset';
import {EventSummary} from './EventSummary';
import {EventTrigger} from './EventTrigger';
import {Log} from './Log';
declare var Object: any;

export interface EventInterface {
  id?: string;
  type: string;
  currentState: string;
  muted: boolean;
  seen: boolean;
  hidden: boolean;
  starred: boolean;
  filtered?: boolean;
  archived?: boolean;
  expiresAt?: Date;
  forwardedTo?: Array<any>;
  created?: Date;
  modified?: Date;
  deleted?: Date;
  assetId?: any;
  _comments?: Array<any>;
  _data?: Array<any>;
  _lastData?: any;
  _stateChanges?: Array<any>;
  summaryId?: any;
  eventTriggerId?: any;
  asset?: Asset;
  comments?: any[];
  data?: any[];
  lastData?: any[];
  stateChanges?: any[];
  summary?: EventSummary;
  eventTrigger?: EventTrigger;
  trackingLogs?: Log[];
}

export class Event implements EventInterface {
  id: string;
  type: string;
  currentState: string;
  muted: boolean;
  seen: boolean;
  hidden: boolean;
  starred: boolean;
  filtered: boolean;
  archived: boolean;
  expiresAt: Date;
  forwardedTo: Array<any>;
  created: Date;
  modified: Date;
  deleted: Date;
  assetId: any;
  _comments: Array<any> = [];
  _data: Array<any> = [];
  _lastData: any;
  _stateChanges: Array<any> = [];
  summaryId: any;
  eventTriggerId: any;
  asset?: Asset;
  comments?: any[];
  data?: any[];
  lastData?: any[];
  stateChanges?: any[];
  summary?: EventSummary;
  eventTrigger?: EventTrigger;
  trackingLogs?: Log[];
  constructor(data?: EventInterface) {
    Object.assign(this, data);
  }

  /**
   * The name of the model represented by this $resource,
   * i.e. `Event`.
   */
  public static getModelName(): string {
    return 'Event';
  }

  /**
   * @method factory
   * @author Jonathan Casarrubias
   * @license MIT
   * This method creates an instance of Event for dynamic purposes.
   */
  public static factory(data: EventInterface): Event{
    return new Event(data);
  }

  /**
   * @method getModelDefinition
   * @author Julien Ledun
   * @license MIT
   * This method returns an object that represents some of the model
   * definitions.
   */
  public static getModelDefinition(): ModelDefinition {
    return {
      name: 'Event',
      plural: 'Events',
      path: 'Events',
      idName: 'id',
      properties: {
        id: {
          name: 'id',
          type: 'string'
        },
        type: {
          name: 'type',
          type: 'string'
        },
        currentState: {
          name: 'currentState',
          type: 'string'
        },
        muted: {
          name: 'muted',
          type: 'boolean'
        },
        seen: {
          name: 'seen',
          type: 'boolean'
        },
        hidden: {
          name: 'hidden',
          type: 'boolean'
        },
        starred: {
          name: 'starred',
          type: 'boolean'
        },
        filtered: {
          name: 'filtered',
          type: 'boolean'
        },
        archived: {
          name: 'archived',
          type: 'boolean'
        },
        expiresAt: {
          name: 'expiresAt',
          type: 'Date'
        },
        forwardedTo: {
          name: 'forwardedTo',
          type: 'Array&lt;any&gt;'
        },
        created: {
          name: 'created',
          type: 'Date'
        },
        modified: {
          name: 'modified',
          type: 'Date'
        },
        deleted: {
          name: 'deleted',
          type: 'Date',
          default: undefined
        },
        assetId: {
          name: 'assetId',
          type: 'any'
        },
        _comments: {
          name: '_comments',
          type: 'Array&lt;any&gt;',
          default: []
        },
        _data: {
          name: '_data',
          type: 'Array&lt;any&gt;',
          default: []
        },
        _lastData: {
          name: '_lastData',
          type: 'any'
        },
        _stateChanges: {
          name: '_stateChanges',
          type: 'Array&lt;any&gt;',
          default: []
        },
        summaryId: {
          name: 'summaryId',
          type: 'any'
        },
        eventTriggerId: {
          name: 'eventTriggerId',
          type: 'any'
        },
      },
      relations: {
        asset: {
          name: 'asset',
          type: 'Asset',
          model: 'Asset',
          relationType: 'belongsTo',
          keyFrom: 'assetId',
          keyTo: 'id'
        },
        comments: {
          name: 'comments',
          type: 'any[]',
          model: '',
          relationType: 'embedsMany',
          keyFrom: '_comments',
          keyTo: 'id'
        },
        data: {
          name: 'data',
          type: 'any[]',
          model: '',
          relationType: 'embedsMany',
          keyFrom: '_data',
          keyTo: 'id'
        },
        lastData: {
          name: 'lastData',
          type: 'any[]',
          model: '',
          relationType: 'embedsOne',
          keyFrom: '_lastData',
          keyTo: 'id'
        },
        stateChanges: {
          name: 'stateChanges',
          type: 'any[]',
          model: '',
          relationType: 'embedsMany',
          keyFrom: '_stateChanges',
          keyTo: 'id'
        },
        summary: {
          name: 'summary',
          type: 'EventSummary',
          model: 'EventSummary',
          relationType: 'belongsTo',
          keyFrom: 'summaryId',
          keyTo: 'id'
        },
        eventTrigger: {
          name: 'eventTrigger',
          type: 'EventTrigger',
          model: 'EventTrigger',
          relationType: 'belongsTo',
          keyFrom: 'eventTriggerId',
          keyTo: 'id'
        },
        trackingLogs: {
          name: 'trackingLogs',
          type: 'Log[]',
          model: 'Log',
          relationType: 'hasMany',
          keyFrom: 'id',
          keyTo: 'trackingModelId'
        },
      }
    };
  }
}
