/*
 * Copyright 2018-present Open Networking Foundation
 *
 * Licensed under the Apache License, Version 2.0 (the 'License');
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an 'AS IS' BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
import * as d3 from 'd3';
import {LocationType} from '../../backgroundsvg/backgroundsvg.component';
import {LayerType, Location, NodeType, RegionProps} from './regions';
import {MetaUi} from 'gui2-fw-lib';

export interface UiElement {
    index?: number;
    id: string;
}

export namespace LabelToggle {
    /**
     * Toggle state for how device labels should be displayed
     */
    export enum Enum {
        NONE,
        ID,
        NAME
    }

    /**
     * Add the method 'next()' to the LabelToggle enum above
     */
    export function next(current: Enum) {
        if (current === Enum.NONE) {
            return Enum.ID;
        } else if (current === Enum.ID) {
            return Enum.NAME;
        } else if (current === Enum.NAME) {
            return Enum.NONE;
        }
    }
}

export namespace HostLabelToggle {
    /**
     * Toggle state for how host labels should be displayed
     */
    export enum Enum {
        NONE,
        NAME,
        IP,
        MAC
    }

    /**
     * Add the method 'next()' to the HostLabelToggle enum above
     */
    export function next(current: Enum) {
        if (current === Enum.NONE) {
            return Enum.NAME;
        } else if (current === Enum.NAME) {
            return Enum.IP;
        } else if (current === Enum.IP) {
            return Enum.MAC;
        } else if (current === Enum.MAC) {
            return Enum.NONE;
        }
    }
}

export namespace GridDisplayToggle {
    /**
     * Toggle state for how the grid should be displayed
     */
    export enum Enum {
        GRIDNONE,
        GRID1000,
        GRIDGEO,
        GRIDBOTH
    }

    /**
     * Add the method 'next()' to the GridDisplayToggle enum above
     */
    export function next(current: Enum) {
        if (current === Enum.GRIDNONE) {
            return Enum.GRID1000;
        } else if (current === Enum.GRID1000) {
            return Enum.GRIDGEO;
        } else if (current === Enum.GRIDGEO) {
            return Enum.GRIDBOTH;
        } else if (current === Enum.GRIDBOTH) {
            return Enum.GRIDNONE;
        }
    }
}

/**
 * model of the topo2CurrentRegion device props from Device below
 */
export interface DeviceProps {
    latitude: number;
    longitude: number;
    gridX: number;
    gridY: number;
    name: string;
    locType: LocationType;
    uiType: string;
    channelId: string;
    managementAddress: string;
    protocol: string;
}

export interface HostProps {
    gridX: number;
    gridY: number;
    latitude: number;
    longitude: number;
    locType: LocationType;
    name: string;
}

/**
 * Implementing SimulationNodeDatum interface into our custom Node class
 */
export abstract class Node implements UiElement, d3.SimulationNodeDatum {
    // Optional - defining optional implementation properties - required for relevant typing assistance
    index?: number;
    x: number;
    y: number;
    vx?: number;
    vy?: number;
    fx?: number | null;
    fy?: number | null;
    nodeType: NodeType;
    id: string;

    protected constructor(id) {
        this.id = id;
        this.x = 0;
        this.y = 0;
    }
}

/**
 * model of the topo2CurrentRegion device from Region below
 */
export class Device extends Node {
    id: string;
    layer: LayerType;
    location: Location;
    metaUi: MetaUi;
    master: string;
    online: boolean;
    props: DeviceProps;
    type: string;

    constructor(id: string) {
        super(id);
    }
}

/**
 * Model of the ONOS Host element in the topology
 */
export class Host extends Node {
    configured: boolean;
    id: string;
    ips: string[];
    layer: LayerType;
    props: HostProps;

    constructor(id: string) {
        super(id);
    }
}


/**
 * model of the topo2CurrentRegion subregion from Region below
 */
export class SubRegion extends Node {
    id: string;
    location: Location;
    nDevs: number;
    nHosts: number;
    name: string;
    props: RegionProps;

    constructor(id: string) {
        super(id);
    }
}

/**
 * Enumerated values for topology update event types
 */
export enum ModelEventType {
    HOST_ADDED_OR_UPDATED,
    LINK_ADDED_OR_UPDATED,
    DEVICE_ADDED_OR_UPDATED,
    DEVICE_REMOVED,
    HOST_REMOVED
}

/**
 * Enumerated values for topology update event memo field
 */
export enum ModelEventMemo {
    ADDED = 'added',
    REMOVED = 'removed',
    UPDATED = 'updated'
}

