/*
 * Copyright 2014-2021 Firestack, all rights reserved.
 */
import * as MoGeneral from './mo/mo.general';
import * as MoHost from './mo/mo.host.models';
import * as MoVM from './mo/mo.vm.models';
import * as MoDatastore from './mo/mo.datastore.models';
import * as MoCluster from './mo/mo.cluster.models';
import * as MoNetwork from './mo/mo.network.models';
import * as MoFolder from './mo/mo.folder.models';
import * as MoRespool from './mo/mo.respool.models';
import * as MoSwitch from './mo/mo.vswitch.models';

export const MoCl = {
  Host: MoHost,
  Datastore: MoDatastore,
  VM: MoVM,
  Cluster: MoCluster,
  Folder: MoFolder,
  General: MoGeneral,
  ResourcePool: MoRespool,
  Network: MoNetwork,
  Switch: MoSwitch,
};

export interface VsphereTarget {
  key: string;
  url: string;
  username?: string;
  password?: string;
  cert?: string;
  watch?: boolean;
  skipFetch?: boolean;
}

export class VsphereEventWebhook {
  name: string;
  url: string;
  events: {[eventType: string]: boolean} = {};
  headers?: {[headerName: string]: string} = {};
  data?: {[key: string]: any} = {};
}

export interface VsphereDatacenterEvent<T = any> {
  eventTime: number;
  eventType?: string;
  sourceMo?: any;
  sourceKey?: string;
  data: T;
  moData?: any;
  extra?: any;
}

export interface VsphereDatacenterUtilizationSnapshot {
  /** unix ts in seconds % 86400 */
  ts: number;
  /** vm count */
  v: number;
  /** host count */
  h: number;
  /** cpu utilization */
  c: number;
  /** mem utilization */
  m: number;
  /** storage utilization */
  s: number;
}

export type VsphereDatacenterUtilizationSnapshotData = [
  number, /** ts */
  number, /** v */
  number, /** h */
  number, /** c */
  number, /** m */
  number, /** s */
];

export interface VsphereDatacenterUtilizationSummary {
  t: number;
  hostCount: number;
  vmCount: number;
  percent: { cpu: number; mem: number; disk: number; };
  overview: {
    totalCpu: number;
    consumedCpu: number;
    percentCpu: number;
    totalMem: number;
    consumedMem: number;
    percentMem: number;
    totalStorage: number;
    consumedStorage: number;
    percentStorage: number;
  };
  clusterSummary: any;
  hostStats: any[];
  storageStats: any[];
  history: VsphereDatacenterUtilizationSnapshotData[];
}

