package wgfunc

import "github.com/vishvananda/netlink"

type Device struct {
	name string
	iPRanges []string
	wgDev *netlink.GenericLink
}


func (s *Device) createNetworkDevice() (error) {
	la := netlink.NewLinkAttrs()
	la.Name = s.name

	wgDev := &netlink.GenericLink{
		LinkAttrs: la,
		LinkType:  "wireguard",
	}

	err := netlink.LinkAdd(wgDev)
	if err != nil {
		return err
	}

	s.wgDev = wgDev

	return nil
}

func (s *Device) upNetworkDevice() (error) {
	err := netlink.LinkSetUp(s.wgDev) //todo: test
	if err != nil {
		return err
	}
	return nil
}

func (s *Device) removeNetworkDevice() (error) {
	la := netlink.NewLinkAttrs()
	la.Name = s.name

	wgDev := &netlink.GenericLink{
		LinkAttrs: la,
		LinkType:  "wireguard",
	}

	err := netlink.LinkDel(wgDev)
	return err
}

func (s *WireGuard) addIPToNetwork() (error) {
	var ips []*netlink.Addr
	for _, iprange := range s.iPRanges {
		ip, err := netlink.ParseAddr(iprange)
		if err != nil {
			return err
		}
		ips = append(ips, ip)
	}

	for _, ip := range ips {
		err := netlink.AddrAdd(s.wgDev, ip)
		if err != nil { //ToDo: Check how to test this case
			return err
		}
	}
	return nil
}