util = require('util')
request = require('request-json');
extend = require('util')._extend
ip = require 'ip'
async = require 'async'

vmctrl = require('./builder/vmCtrl')


log = require('./utils/logger').getLogger()
log.info "Node - Logger test message"


#utility functions 
#Todo:  Not scalable....To be modified
#HWADDR_PREFIX = "00:16:3e:5a:55:"
HWADDR_PREFIX = "00:00:00:00:00:"

HWADDR_START = 10
getHwAddress = () ->
    HWADDR_START++      
    hwaddr= "#{HWADDR_PREFIX}#{HWADDR_START}"
    hwaddr


class node
    constructor:(data) ->
        @ifmap = []        
        @lagmap = []
        @ifindex = 1
        @lagindex = 1
        @config = extend {}, data   
        @config.ifmap = @ifmap      
        @config.lagmap = @lagmap  
        @statistics = {}
        @status = {}
        log.debug "node object created with  " + JSON.stringify @config

   
    addLanInterface :(brname, ipaddress, subnetmask, gateway, characterstics) ->         
        interf =
            "ifname" : "eth#{@ifindex}"
            "hwAddress" : getHwAddress()
            "brname" : brname 
            "ipaddress": ipaddress 
            "netmask" : subnetmask
            "gateway" : gateway if gateway?
            "type":"lan"
            "veth" : "#{@config.name}_veth#{@ifindex}"
            "config": characterstics
        log.debug "lan interface " + JSON.stringify interf
        @ifindex++
        @ifmap.push  interf
        @lanip = ipaddress

    addLagInterface :(brname,bondname,ipaddress,subnetmask,gateway,characterstics)->
        lagif1 = "eth#{@ifindex}"
        veth1 = "#{@config.name}_veth#{@ifindex}"
        @ifindex++
        lagif2 = "eth#{@ifindex}"
        veth2 = "#{@config.name}_veth#{@ifindex}"
        lagif =
            "bondname" : bondname
            "lagif1" : lagif1
            "hwAddress1" : getHwAddress()
            "veth1" : veth1
            "lagif2" : lagif2
            "hwAddress2" : getHwAddress()
            "veth2" : veth2
            "brname" : brname 
            "ipaddress": ipaddress 
            "netmask" : subnetmask
            "gateway" : gateway if gateway?
            "type":"lan"            
            "config": characterstics
        @lagmap.push lagif
        
    addWanInterface :(brname, ipaddress, subnetmask, gateway , characterstics) ->         
        #console.log "inside addWanInterface function"
        interf =
            "ifname" : "eth#{@ifindex}"
            "hwAddress" : getHwAddress()
            "brname" : brname
            "ipaddress": ipaddress
            "netmask" : subnetmask
            "gateway" : gateway if gateway?
            "type":"wan"
            "veth" : "#{@config.name}_veth#{@ifindex}"
            "config": characterstics
        log.debug "waninterface " + JSON.stringify  interf
        @ifindex++
        @ifmap.push  interf

    addMgmtInterface :(ipaddress, subnetmask) ->
        interf =
            "ifname" : "eth0"
            "hwAddress" : getHwAddress()                
            "ipaddress": ipaddress
            "netmask" : subnetmask                
            "type":"mgmt"
        log.debug "mgmt interface" + JSON.stringify interf
        @ifmap.push  interf
        @mgmtip = ipaddress
        @config.mgmtip = @mgmtip
        #console.log @ifmap

    create : (callback)->
        log.info "createing node " + JSON.stringify @config
        vmctrl.create @config, (result) =>
            @uuid = result.id
            @config.id = @uuid
            @config.status = result.status
            log.info "node creation result " + JSON.stringify result
            callback result
    start : (callback)->
        log.info "starting a node "  +  @config.name
        vmctrl.start @uuid, (result) =>
            log.info "node start result " + JSON.stringify result
            @config.status = result.status
            callback result
    provision : (callback)->
        log.info "provisioning  a node " + @config.name



        vmctrl.provision @uuid, (result) =>
            log.info "node provision result " + JSON.stringify result
            #@config.status = result. status
            callback result
    stop : (callback)->
        log.info "stopping a node " + @config.name
        vmctrl.stop @uuid, (result) =>
            log.info "node stop result " + JSON.stringify result            
            @config.status = result.status
            callback result
    trace : (callback)->
        vmctrl.packettrace @uuid, (res) =>
            log.info "node packettrace result " + res            
            callback res    
    del : (callback)->
        log.info "node deleting  " + @config.name
        vmctrl.del @uuid, (res) =>
            log.info "node del result " + JSON.stringify res            
            @config.status = result.status
            callback res    
    getstatus : (callback)->
        log.info "getstatus called" + @uuid
        vmctrl.get @uuid, (result) =>
            log.info "node getstatus result " + JSON.stringify result
            @config.status = result.status
            callback result
    getrunningstatus : (callback)->
        vmctrl.status @params.id, (res) =>
            log.info "node running status result " +  res
            callback res  

    setLinkChars : (callback)->
        log.info "setting the link characterstics " + @config.name
        vmctrl.setLinkChars @uuid, (result) =>
            log.info "setLinkChars result " +  result            
            callback result

    get : () ->
        "id" : @uuid
        "config": @config
        #"status": @status
        #"statistics":@statistics
module.exports = node


#Todo items
#request.json - HTTP response  code
#Timeout condition - if server is not reachable
     
