package types

import (
	"encoding/json"
	"fmt"
	"net"
	//"strconv"
	//"strings"
	"testing"
	//"bytes"
	//"encoding/binary"
	//"bytes"
	//"io/ioutil"
	"git.loafle.net/overflow/overflow_probe/discovery/discovery/types/timestamp"
	//"net/http"
)

type DiscoveryZone222 struct {
	MinIp   string        `json:"-"`
	MaxIp   string        `json:"-"`
	LocalIp string        `json:"ip"`
	Cidr    string        `json:"cidr"`
	Inter   net.Interface `json:"-"`
	//Hosts   map[string]*Host `json:"-"`
}

func TestZone222(t *testing.T) {

	zz := DiscoveryZone222{}

	zz.MaxIp = "192.168.1.254"
	zz.MinIp = "192.168.1.1"
	zz.LocalIp = "192.168.1.207"
	zz.Cidr = "192.168.1.0/24"

	jb, _ := json.Marshal(zz)

	fmt.Println(string(jb))

}

type DiscoveryZone1 struct {
	MinIp  string        `json:"-"`
	MaxIp  string        `json:"-"`
	Ip_    string        `json:"-"`
	Cidr_  string        `json:"-"`
	Inter_ net.Interface `json:"-"`
	//Hosts  map[string]*Host `json:"-"`

	Ip   int64 `json:"ip"`
	Cidr int64 `json:"cidr"`

	HostScanHistories []*DiscoveryHostHistory `json:"hostScanHistories"`
}

type DiscoveryHostHistory struct {
	ID int   `json:"id"`
	Ip int64 `json:"ip"`

	CreateDate  timestamp.Timestamp `json:"createDate"`
	SendDate    timestamp.Timestamp `json:"sendDate"`
	ResultDate  timestamp.Timestamp `json:"resultDate"`
	ResultType  string              `json:"resultType"`
	Description string              `json:"description"`
}

func TestDiscoveryZone(t *testing.T) {

	zones := NewZones()

	fmt.Println(len(zones))
	fmt.Println(zones[0].LocalIp_)
	fmt.Println(zones[0].Cidr)

	var zone DiscoveryZone = DiscoveryZone{
		MinIp_:   "192.168.0.1",
		MaxIp_:   "192.168.0.254",
		Cidr:     "192.168.0.0/24",
		LocalIp_: "192.168.0.203",
		Inter_:   net.Interface{},
		Hosts_:   make(map[string]*DiscoveryHost, 255),
		Ip:       233312321,
		Cidr_:    123123321,
	}

	var zones1 []*DiscoveryZone
	zones1 = append(zones1, &zone)
	z := NewZonesByDiscoveryZone(zones1)

	fmt.Println(len(z))
	//for _, zone := range zones {
	//	//a := inet_strton(zone.LocalIp)
	//	//fmt.Println(a)
	//	//
	//	//str := inet_ntoa(a)
	//	//
	//	//fmt.Println(str)
	//
	//	//aa := CidrToInt64(zone.Cidr)
	//   //
	//	//fmt.Println(aa)
	//   //
	//	//str := Int64ToCidr(aa)
	//   //
	//	//fmt.Println(str)
	//
	//}

}

//func CreateDHH(ip string) *DiscoveryHostHistory {
//	dhh := &DiscoveryHostHistory{}
//
//	dhh.CreateDate = timestamp.Now()
//	dhh.SendDate = timestamp.Now()
//	dhh.ResultDate = timestamp.Now()
//	dhh.Description = "testest"
//
//	strIp := "192.168.1."
//	strIp += ip
//	dhh.Ip = inet_strton(strIp)
//
//	return dhh
//}
//
//func TestInsertDZone(t *testing.T) {
//
//	dz := DiscoveryZone{}
//
//	dz.Cidr_ = "192.168.1.0/24"
//	dz.Ip_ = "192.168.1.207"
//
//	dz.Cidr = CidrToInt64(dz.Cidr_)
//	dz.Ip = inet_strton(dz.Ip_)
//
//	dz.HostScanHistories = append(dz.HostScanHistories, CreateDHH("103"), CreateDHH("104"), CreateDHH("105"), CreateDHH("106"))
//
//	fmt.Println(inet_ntoa(dz.Ip))
//	fmt.Println(Int64ToCidr(dz.Cidr))
//
//	jb, _ := json.Marshal(dz)
//
//	fmt.Println(string(jb))
//
//	resp, _ := http.Post("http://192.168.1.207:8080/discoveryZone", "application/json", bytes.NewBuffer(jb))
//	bb, _ := ioutil.ReadAll(resp.Body)
//
//	ddzz := DiscoveryZone{}
//
//	json.Unmarshal(bb, &ddzz)
//
//	fmt.Println(ddzz)
//
//	resp.Body.Close()
//
//}
//
//func TestSelectDZone(t *testing.T) {
//
//	resp, _ := http.Get("http://192.168.1.207:8080/discoveryZone/1")
//	bb, _ := ioutil.ReadAll(resp.Body)
//	ddzz := DiscoveryZone{}
//
//	fmt.Println(string(bb))
//	json.Unmarshal(bb, &ddzz)
//
//	fmt.Println(ddzz)
//
//	fmt.Println(Int64ToCidr(ddzz.Cidr))
//	fmt.Println(inet_ntoa(ddzz.Ip))
//
//	resp.Body.Close()
//}
//
//func inet_ntoa(ipnr int64) net.IP {
//	var bytes [4]byte
//	bytes[0] = byte(ipnr & 0xFF)
//	bytes[1] = byte((ipnr >> 8) & 0xFF)
//	bytes[2] = byte((ipnr >> 16) & 0xFF)
//	bytes[3] = byte((ipnr >> 24) & 0xFF)
//
//	return net.IPv4(bytes[3], bytes[2], bytes[1], bytes[0])
//}
//
//// Convert net.IP to int64 ,  http://www.outofmemory.cn
//func inet_aton(ipnr net.IP) int64 {
//	bits := strings.Split(ipnr.String(), ".")
//
//	b0, _ := strconv.Atoi(bits[0])
//	b1, _ := strconv.Atoi(bits[1])
//	b2, _ := strconv.Atoi(bits[2])
//	b3, _ := strconv.Atoi(bits[3])
//
//	var sum int64
//
//	sum += int64(b0) << 24
//	sum += int64(b1) << 16
//	sum += int64(b2) << 8
//	sum += int64(b3)
//
//	return sum
//}
//
//func inet_strton(ipnr string) int64 {
//	bits := strings.Split(ipnr, ".")
//
//	b0, _ := strconv.Atoi(bits[0])
//	b1, _ := strconv.Atoi(bits[1])
//	b2, _ := strconv.Atoi(bits[2])
//	b3, _ := strconv.Atoi(bits[3])
//
//	var sum int64
//
//	sum += int64(b0) << 24
//	sum += int64(b1) << 16
//	sum += int64(b2) << 8
//	sum += int64(b3)
//
//	return sum
//}
//
//func CidrToInt64(cidr string) int64 {
//
//	bits := strings.Split(cidr, ".")
//
//	b0, _ := strconv.Atoi(bits[0])
//	b1, _ := strconv.Atoi(bits[1])
//	b2, _ := strconv.Atoi(bits[2])
//	//b3, _ := strconv.Atoi(bits[3])
//
//	masks := strings.Split(bits[3], "/")
//
//	bb3 := masks[0]
//	bb4 := masks[1]
//
//	b3, _ := strconv.Atoi(bb3)
//	b4, _ := strconv.Atoi(bb4)
//
//	var sum int64
//
//	sum += int64(b0) << 32
//	sum += int64(b1) << 24
//	sum += int64(b2) << 16
//	sum += int64(b3) << 8
//	sum += int64(b4)
//
//	return sum
//
//}
//
//func Int64ToCidr(cidrInt int64) string {
//
//	c1 := cidrInt & 0xFF
//	c2 := (cidrInt >> 8) & 0xFF
//	c3 := (cidrInt >> 16) & 0xFF
//	c4 := (cidrInt >> 24) & 0xFF
//	c5 := (cidrInt >> 32) & 0xFF
//
//	var cidr string
//
//	cidr += strconv.FormatInt(c5, 10)
//	cidr += "."
//	cidr += strconv.FormatInt(c4, 10)
//	cidr += "."
//	cidr += strconv.FormatInt(c3, 10)
//	cidr += "."
//	cidr += strconv.FormatInt(c2, 10)
//	cidr += "/"
//	cidr += strconv.FormatInt(c1, 10)
//
//	return cidr
//}
