import {ModelDefinition} from './BaseModels';
import {Customer} from './Customer';
import {DeviceEvent} from './DeviceEvent';
import {DeviceToken} from './DeviceToken';
import {EdgeAgent} from './EdgeAgent';
import {Log} from './Log';
import {TelegramChat} from './TelegramChat';
declare var Object: any;

export interface DeviceInterface {
  id?: string;
  name: string;
  enabled: boolean;
  description?: string;
  requested?: Date;
  created?: Date;
  modified?: Date;
  deleted?: Date;
  customerId?: any;
  _config?: any;
  customer?: Customer;
  config?: any[];
  events?: DeviceEvent[];
  token?: DeviceToken;
  edgeAgents?: EdgeAgent[];
  trackingLogs?: Log[];
  telegramChats?: TelegramChat[];
}

export class Device implements DeviceInterface {
  id: string;
  name: string;
  enabled: boolean;
  description: string;
  requested: Date;
  created: Date;
  modified: Date;
  deleted: Date;
  customerId: any;
  _config: any;
  customer?: Customer;
  config?: any[];
  events?: DeviceEvent[];
  token?: DeviceToken;
  edgeAgents?: EdgeAgent[];
  trackingLogs?: Log[];
  telegramChats?: TelegramChat[];
  constructor(data?: DeviceInterface) {
    Object.assign(this, data);
  }

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

  /**
   * @method factory
   * @author Jonathan Casarrubias
   * @license MIT
   * This method creates an instance of Device for dynamic purposes.
   */
  public static factory(data: DeviceInterface): Device{
    return new Device(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: 'Device',
      plural: 'Devices',
      path: 'Devices',
      idName: 'id',
      properties: {
        id: {
          name: 'id',
          type: 'string'
        },
        name: {
          name: 'name',
          type: 'string'
        },
        enabled: {
          name: 'enabled',
          type: 'boolean'
        },
        description: {
          name: 'description',
          type: 'string'
        },
        requested: {
          name: 'requested',
          type: 'Date'
        },
        created: {
          name: 'created',
          type: 'Date'
        },
        modified: {
          name: 'modified',
          type: 'Date'
        },
        deleted: {
          name: 'deleted',
          type: 'Date',
          default: undefined
        },
        customerId: {
          name: 'customerId',
          type: 'any'
        },
        _config: {
          name: '_config',
          type: 'any'
        },
      },
      relations: {
        customer: {
          name: 'customer',
          type: 'Customer',
          model: 'Customer',
          relationType: 'belongsTo',
          keyFrom: 'customerId',
          keyTo: 'id'
        },
        config: {
          name: 'config',
          type: 'any[]',
          model: '',
          relationType: 'embedsOne',
          keyFrom: '_config',
          keyTo: 'id'
        },
        events: {
          name: 'events',
          type: 'DeviceEvent[]',
          model: 'DeviceEvent',
          relationType: 'hasMany',
          keyFrom: 'id',
          keyTo: 'deviceId'
        },
        token: {
          name: 'token',
          type: 'DeviceToken',
          model: 'DeviceToken',
          relationType: 'hasOne',
          keyFrom: 'id',
          keyTo: 'deviceId'
        },
        edgeAgents: {
          name: 'edgeAgents',
          type: 'EdgeAgent[]',
          model: 'EdgeAgent',
          relationType: 'hasMany',
          keyFrom: 'id',
          keyTo: 'deviceId'
        },
        trackingLogs: {
          name: 'trackingLogs',
          type: 'Log[]',
          model: 'Log',
          relationType: 'hasMany',
          keyFrom: 'id',
          keyTo: 'trackingModelId'
        },
        telegramChats: {
          name: 'telegramChats',
          type: 'TelegramChat[]',
          model: 'TelegramChat',
          relationType: 'hasMany',
          modelThrough: 'TelegramChatDevice',
          keyThrough: 'telegramChatId',
          keyFrom: 'id',
          keyTo: 'deviceId'
        },
      }
    };
  }
}
