import { Action } from '@ngrx/store';

import {
  Zone,
  Host,
  Port,
  Service,
  DiscoverZone as MDDiscoverZone,
  DiscoverHost as MDDiscoverHost,
  DiscoverPort as MDDiscoverPort,
  DiscoverService as MDiscoverService,
} from '@overflow/commons-typescript/model/discovery';

 export enum ActionType {
  DiscoverZone = '[discovery.discovery] discoverZone',
  DiscoverHost = '[discovery.discovery] discoverHost',
  DiscoverPort = '[discovery.discovery] discoverPort',
  DiscoverService = '[discovery.discovery] discoverService',

  DiscoveryStart = '[discovery.discovery] DiscoveryService.discoveryStart',
  DiscoveryStop = '[discovery.discovery] DiscoveryService.discoveryStop',
  DiscoveredZone = '[discovery.discovery] DiscoveryService.discoveredZone',
  DiscoveredHost = '[discovery.discovery] DiscoveryService.discoveredHost',
  DiscoveredPort = '[discovery.discovery] DiscoveryService.discoveredPort',
  DiscoveredService = '[discovery.discovery] DiscoveryService.discoveredService',
}

export class DiscoverZone implements Action {
  readonly type = ActionType.DiscoverZone;

  constructor(public payload: {probeID: string, discoverZone: MDDiscoverZone}) {}
}

export class DiscoverHost implements Action {
  readonly type = ActionType.DiscoverHost;

  constructor(public payload: {probeID: string, zone: Zone, discoverHost: MDDiscoverHost}) {}
}

export class DiscoverPort implements Action {
  readonly type = ActionType.DiscoverPort;

  constructor(public payload: {probeID: string, host: Host, discoverPort: MDDiscoverPort}) {}
}

export class DiscoverService implements Action {
  readonly type = ActionType.DiscoverService;
  constructor(public payload: {probeID: string, port: Port, discoverService: MDiscoverService}) {}
}

export class DiscoveryStart implements Action {
  readonly type = ActionType.DiscoveryStart;

  constructor(public payload: Date) {}
}

export class DiscoveryStop implements Action {
  readonly type = ActionType.DiscoveryStop;

  constructor(public payload: Date) {}
}

export class DiscoveredZone implements Action {
  readonly type = ActionType.DiscoveredZone;

  constructor(public payload: Zone) {}
}

export class DiscoveredHost implements Action {
  readonly type = ActionType.DiscoveredHost;

  constructor(public payload: Host) {}
}

export class DiscoveredPort implements Action {
  readonly type = ActionType.DiscoveredPort;

  constructor(public payload: Port) {}
}

export class DiscoveredService implements Action {
  readonly type = ActionType.DiscoveredService;
  constructor(public payload: Service) {}
}

export type Actions =
  | DiscoverZone
  | DiscoverHost
  | DiscoverPort
  | DiscoverService
  | DiscoveryStart
  | DiscoveryStop
  | DiscoveredZone
  | DiscoveredHost
  | DiscoveredPort
  | DiscoveredService
;