import {ModelDefinition} from './BaseModels';
import {Alert} from './Alert';
import {AlertHistory} from './AlertHistory';
import {AssetMilestone} from './AssetMilestone';
import {AssetOperabilitySummary} from './AssetOperabilitySummary';
import {AssetRestrictionTable} from './AssetRestrictionTable';
import {AssetStaff} from './AssetStaff';
import {AssetState} from './AssetState';
import {AssetStateChange} from './AssetStateChange';
import {AssetTemplate} from './AssetTemplate';
import {AssetWizardType} from './AssetWizardType';
import {Credential} from './Credential';
import {Admin} from './Admin';
import {Customer} from './Customer';
import {Dataset} from './Dataset';
import {EdgeAgent} from './EdgeAgent';
import {Event} from './Event';
import {EventGroup} from './EventGroup';
import {EventSummary} from './EventSummary';
import {EventSummaryForAsset} from './EventSummaryForAsset';
import {EventTrigger} from './EventTrigger';
import {HealthcheckEvent} from './HealthcheckEvent';
import {Log} from './Log';
import {Manager} from './Manager';
import {Project} from './Project';
import {RateLimit} from './RateLimit';
import {ResponseProtocol} from './ResponseProtocol';
import {Sensor} from './Sensor';
import {SensorUptime} from './SensorUptime';
import {SensorUptimeCollector} from './SensorUptimeCollector';
import {Summary} from './Summary';
declare var Object: any;

export interface AssetInterface {
  type: string;
  name?: string;
  icon?: string;
  description?: string;
  referenceId?: string;
  uri?: string;
  path?: Array<any>;
  requested?: Date;
  settingsType?: string;
  healthcheckEventsEnabled?: boolean;
  currentHealthStatus?: string;
  currentHealthStatusDetails?: any;
  tags?: Array<any>;
  created?: Date;
  modified?: Date;
  deleted?: Date;
  id?: any;
  assetId?: any;
  _config?: any;
  currentStateId?: any;
  templateId?: any;
  assetWizardTypeId?: any;
  customerId?: any;
  projectId?: any;
  _rateLimit?: any;
  responseProtocolId?: any;
  _token?: any;
  assets?: Asset[];
  asset?: Asset;
  alerts?: Alert[];
  alertHistory?: AlertHistory[];
  config?: any[];
  milestone?: AssetMilestone;
  operabilitySummaries?: AssetOperabilitySummary[];
  restrictionTable?: AssetRestrictionTable;
  staffs?: AssetStaff[];
  assetStates?: AssetState[];
  currentState?: AssetState;
  nextState?: AssetStateChange;
  container?: any;
  template?: AssetTemplate;
  assetWizardType?: AssetWizardType;
  credentials?: Credential[];
  admins?: Admin[];
  customer?: Customer;
  datasets?: Dataset[];
  edgeAgents?: EdgeAgent[];
  events?: Event[];
  eventGroups?: EventGroup[];
  eventSummaries?: EventSummary[];
  eventSummaryForAssets?: EventSummaryForAsset[];
  eventTriggers?: EventTrigger[];
  features?: any[];
  healthcheckEvents?: HealthcheckEvent[];
  trackingLogs?: Log[];
  managers?: Manager[];
  project?: Project;
  rateLimit?: RateLimit[];
  responseProtocol?: ResponseProtocol;
  sensors?: Sensor[];
  sensorUptimes?: SensorUptime[];
  sensorUptimeCollectors?: SensorUptimeCollector[];
  summaries?: Summary[];
  token?: any[];
}

export class Asset implements AssetInterface {
  type: string;
  name: string;
  icon: string;
  description: string;
  referenceId: string;
  uri: string;
  path: Array<any> = [];
  requested: Date;
  settingsType: string;
  healthcheckEventsEnabled: boolean;
  currentHealthStatus: string;
  currentHealthStatusDetails: any;
  tags: Array<any> = [];
  created: Date;
  modified: Date;
  deleted: Date;
  id: any;
  assetId: any;
  _config: any;
  currentStateId: any;
  templateId: any;
  assetWizardTypeId: any;
  customerId: any;
  projectId: any;
  _rateLimit: any;
  responseProtocolId: any;
  _token: any;
  assets?: Asset[];
  asset?: Asset;
  alerts?: Alert[];
  alertHistory?: AlertHistory[];
  config?: any[];
  milestone?: AssetMilestone;
  operabilitySummaries?: AssetOperabilitySummary[];
  restrictionTable?: AssetRestrictionTable;
  staffs?: AssetStaff[];
  assetStates?: AssetState[];
  currentState?: AssetState;
  nextState?: AssetStateChange;
  container?: any;
  template?: AssetTemplate;
  assetWizardType?: AssetWizardType;
  credentials?: Credential[];
  admins?: Admin[];
  customer?: Customer;
  datasets?: Dataset[];
  edgeAgents?: EdgeAgent[];
  events?: Event[];
  eventGroups?: EventGroup[];
  eventSummaries?: EventSummary[];
  eventSummaryForAssets?: EventSummaryForAsset[];
  eventTriggers?: EventTrigger[];
  features?: any[];
  healthcheckEvents?: HealthcheckEvent[];
  trackingLogs?: Log[];
  managers?: Manager[];
  project?: Project;
  rateLimit?: RateLimit[];
  responseProtocol?: ResponseProtocol;
  sensors?: Sensor[];
  sensorUptimes?: SensorUptime[];
  sensorUptimeCollectors?: SensorUptimeCollector[];
  summaries?: Summary[];
  token?: any[];
  constructor(data?: AssetInterface) {
    Object.assign(this, data);
  }

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

  /**
   * @method factory
   * @author Jonathan Casarrubias
   * @license MIT
   * This method creates an instance of Asset for dynamic purposes.
   */
  public static factory(data: AssetInterface): Asset{
    return new Asset(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: 'Asset',
      plural: 'Assets',
      path: 'Assets',
      idName: 'id',
      properties: {
        type: {
          name: 'type',
          type: 'string'
        },
        name: {
          name: 'name',
          type: 'string'
        },
        icon: {
          name: 'icon',
          type: 'string'
        },
        description: {
          name: 'description',
          type: 'string'
        },
        referenceId: {
          name: 'referenceId',
          type: 'string'
        },
        uri: {
          name: 'uri',
          type: 'string'
        },
        path: {
          name: 'path',
          type: 'Array&lt;any&gt;',
          default: []
        },
        requested: {
          name: 'requested',
          type: 'Date'
        },
        settingsType: {
          name: 'settingsType',
          type: 'string'
        },
        healthcheckEventsEnabled: {
          name: 'healthcheckEventsEnabled',
          type: 'boolean'
        },
        currentHealthStatus: {
          name: 'currentHealthStatus',
          type: 'string'
        },
        currentHealthStatusDetails: {
          name: 'currentHealthStatusDetails',
          type: 'any'
        },
        tags: {
          name: 'tags',
          type: 'Array&lt;any&gt;',
          default: []
        },
        created: {
          name: 'created',
          type: 'Date'
        },
        modified: {
          name: 'modified',
          type: 'Date'
        },
        deleted: {
          name: 'deleted',
          type: 'Date',
          default: undefined
        },
        id: {
          name: 'id',
          type: 'any'
        },
        assetId: {
          name: 'assetId',
          type: 'any'
        },
        _config: {
          name: '_config',
          type: 'any'
        },
        currentStateId: {
          name: 'currentStateId',
          type: 'any'
        },
        templateId: {
          name: 'templateId',
          type: 'any'
        },
        assetWizardTypeId: {
          name: 'assetWizardTypeId',
          type: 'any'
        },
        customerId: {
          name: 'customerId',
          type: 'any'
        },
        projectId: {
          name: 'projectId',
          type: 'any'
        },
        _rateLimit: {
          name: '_rateLimit',
          type: 'any'
        },
        responseProtocolId: {
          name: 'responseProtocolId',
          type: 'any'
        },
        _token: {
          name: '_token',
          type: 'any'
        },
      },
      relations: {
        assets: {
          name: 'assets',
          type: 'Asset[]',
          model: 'Asset',
          relationType: 'hasMany',
          keyFrom: 'id',
          keyTo: 'assetId'
        },
        asset: {
          name: 'asset',
          type: 'Asset',
          model: 'Asset',
          relationType: 'belongsTo',
          keyFrom: 'assetId',
          keyTo: 'id'
        },
        alerts: {
          name: 'alerts',
          type: 'Alert[]',
          model: 'Alert',
          relationType: 'hasMany',
          keyFrom: 'id',
          keyTo: 'assetId'
        },
        alertHistory: {
          name: 'alertHistory',
          type: 'AlertHistory[]',
          model: 'AlertHistory',
          relationType: 'hasMany',
          keyFrom: 'id',
          keyTo: 'assetId'
        },
        config: {
          name: 'config',
          type: 'any[]',
          model: '',
          relationType: 'embedsOne',
          keyFrom: '_config',
          keyTo: 'id'
        },
        milestone: {
          name: 'milestone',
          type: 'AssetMilestone',
          model: 'AssetMilestone',
          relationType: 'hasOne',
          keyFrom: 'id',
          keyTo: 'assetId'
        },
        operabilitySummaries: {
          name: 'operabilitySummaries',
          type: 'AssetOperabilitySummary[]',
          model: 'AssetOperabilitySummary',
          relationType: 'hasMany',
          keyFrom: 'id',
          keyTo: 'assetId'
        },
        restrictionTable: {
          name: 'restrictionTable',
          type: 'AssetRestrictionTable',
          model: 'AssetRestrictionTable',
          relationType: 'hasOne',
          keyFrom: 'id',
          keyTo: 'assetId'
        },
        staffs: {
          name: 'staffs',
          type: 'AssetStaff[]',
          model: 'AssetStaff',
          relationType: 'hasMany',
          keyFrom: 'id',
          keyTo: 'assetId'
        },
        assetStates: {
          name: 'assetStates',
          type: 'AssetState[]',
          model: 'AssetState',
          relationType: 'hasMany',
          keyFrom: 'id',
          keyTo: 'assetId'
        },
        currentState: {
          name: 'currentState',
          type: 'AssetState',
          model: 'AssetState',
          relationType: 'belongsTo',
          keyFrom: 'currentStateId',
          keyTo: 'id'
        },
        nextState: {
          name: 'nextState',
          type: 'AssetStateChange',
          model: 'AssetStateChange',
          relationType: 'hasOne',
          keyFrom: 'id',
          keyTo: 'assetId'
        },
        container: {
          name: 'container',
          type: 'any',
          model: '',
          relationType: 'hasOne',
          keyFrom: 'id',
          keyTo: 'assetId'
        },
        template: {
          name: 'template',
          type: 'AssetTemplate',
          model: 'AssetTemplate',
          relationType: 'belongsTo',
          keyFrom: 'templateId',
          keyTo: 'id'
        },
        assetWizardType: {
          name: 'assetWizardType',
          type: 'AssetWizardType',
          model: 'AssetWizardType',
          relationType: 'belongsTo',
          keyFrom: 'assetWizardTypeId',
          keyTo: 'id'
        },
        credentials: {
          name: 'credentials',
          type: 'Credential[]',
          model: 'Credential',
          relationType: 'hasMany',
          modelThrough: 'CredentialAsset',
          keyThrough: 'credentialId',
          keyFrom: 'id',
          keyTo: 'assetId'
        },
        admins: {
          name: 'admins',
          type: 'Admin[]',
          model: 'Admin',
          relationType: 'hasMany',
          modelThrough: 'AdminAsset',
          keyThrough: 'adminId',
          keyFrom: 'id',
          keyTo: 'assetId'
        },
        customer: {
          name: 'customer',
          type: 'Customer',
          model: 'Customer',
          relationType: 'belongsTo',
          keyFrom: 'customerId',
          keyTo: 'id'
        },
        datasets: {
          name: 'datasets',
          type: 'Dataset[]',
          model: 'Dataset',
          relationType: 'hasMany',
          keyFrom: 'id',
          keyTo: 'assetId'
        },
        edgeAgents: {
          name: 'edgeAgents',
          type: 'EdgeAgent[]',
          model: 'EdgeAgent',
          relationType: 'hasMany',
          modelThrough: 'EdgeAgentAsset',
          keyThrough: 'edgeAgentId',
          keyFrom: 'id',
          keyTo: 'assetId'
        },
        events: {
          name: 'events',
          type: 'Event[]',
          model: 'Event',
          relationType: 'hasMany',
          keyFrom: 'id',
          keyTo: 'assetId'
        },
        eventGroups: {
          name: 'eventGroups',
          type: 'EventGroup[]',
          model: 'EventGroup',
          relationType: 'hasMany',
          keyFrom: 'id',
          keyTo: 'assetId'
        },
        eventSummaries: {
          name: 'eventSummaries',
          type: 'EventSummary[]',
          model: 'EventSummary',
          relationType: 'hasMany',
          keyFrom: 'id',
          keyTo: 'assetId'
        },
        eventSummaryForAssets: {
          name: 'eventSummaryForAssets',
          type: 'EventSummaryForAsset[]',
          model: 'EventSummaryForAsset',
          relationType: 'hasMany',
          keyFrom: 'id',
          keyTo: 'assetId'
        },
        eventTriggers: {
          name: 'eventTriggers',
          type: 'EventTrigger[]',
          model: 'EventTrigger',
          relationType: 'hasMany',
          keyFrom: 'id',
          keyTo: 'assetId'
        },
        features: {
          name: 'features',
          type: 'any[]',
          model: '',
          relationType: 'hasMany',
          keyFrom: 'id',
          keyTo: 'assetId'
        },
        healthcheckEvents: {
          name: 'healthcheckEvents',
          type: 'HealthcheckEvent[]',
          model: 'HealthcheckEvent',
          relationType: 'hasMany',
          keyFrom: 'id',
          keyTo: 'assetId'
        },
        trackingLogs: {
          name: 'trackingLogs',
          type: 'Log[]',
          model: 'Log',
          relationType: 'hasMany',
          keyFrom: 'id',
          keyTo: 'trackingModelId'
        },
        managers: {
          name: 'managers',
          type: 'Manager[]',
          model: 'Manager',
          relationType: 'hasMany',
          modelThrough: 'ManagerAsset',
          keyThrough: 'managerId',
          keyFrom: 'id',
          keyTo: 'assetId'
        },
        project: {
          name: 'project',
          type: 'Project',
          model: 'Project',
          relationType: 'belongsTo',
          keyFrom: 'projectId',
          keyTo: 'id'
        },
        rateLimit: {
          name: 'rateLimit',
          type: 'RateLimit[]',
          model: 'RateLimit',
          relationType: 'embedsOne',
          keyFrom: '_rateLimit',
          keyTo: 'id'
        },
        responseProtocol: {
          name: 'responseProtocol',
          type: 'ResponseProtocol',
          model: 'ResponseProtocol',
          relationType: 'belongsTo',
          keyFrom: 'responseProtocolId',
          keyTo: 'id'
        },
        sensors: {
          name: 'sensors',
          type: 'Sensor[]',
          model: 'Sensor',
          relationType: 'hasMany',
          keyFrom: 'id',
          keyTo: 'assetId'
        },
        sensorUptimes: {
          name: 'sensorUptimes',
          type: 'SensorUptime[]',
          model: 'SensorUptime',
          relationType: 'hasMany',
          keyFrom: 'id',
          keyTo: 'assetId'
        },
        sensorUptimeCollectors: {
          name: 'sensorUptimeCollectors',
          type: 'SensorUptimeCollector[]',
          model: 'SensorUptimeCollector',
          relationType: 'hasMany',
          keyFrom: 'id',
          keyTo: 'assetId'
        },
        summaries: {
          name: 'summaries',
          type: 'Summary[]',
          model: 'Summary',
          relationType: 'hasMany',
          keyFrom: 'id',
          keyTo: 'assetId'
        },
        token: {
          name: 'token',
          type: 'any[]',
          model: '',
          relationType: 'embedsOne',
          keyFrom: '_token',
          keyTo: 'id'
        },
      }
    };
  }
}
