// Copyright 2011 The Go Authors.  All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.

// IP-level socket options for Windows

package net

import (
	"os"
	"syscall"
)

func ipv4MulticastInterface(fd *netFD) (*Interface, error) {
	// TODO: Implement this
	return nil, syscall.EWINDOWS
}

func setIPv4MulticastInterface(fd *netFD, ifi *Interface) error {
	ip, err := interfaceToIPv4Addr(ifi)
	if err != nil {
		return os.NewSyscallError("setsockopt", err)
	}
	var x [4]byte
	copy(x[:], ip.To4())
	fd.incref()
	defer fd.decref()
	err = syscall.SetsockoptInet4Addr(fd.sysfd, syscall.IPPROTO_IP, syscall.IP_MULTICAST_IF, x)
	if err != nil {
		return os.NewSyscallError("setsockopt", err)
	}
	return nil
}

func ipv4MulticastTTL(fd *netFD) (int, error) {
	// TODO: Implement this
	return -1, syscall.EWINDOWS
}

func setIPv4MulticastTTL(fd *netFD, v int) error {
	fd.incref()
	defer fd.decref()
	err := syscall.SetsockoptInt(fd.sysfd, syscall.IPPROTO_IP, syscall.IP_MULTICAST_TTL, v)
	if err != nil {
		return os.NewSyscallError("setsockopt", err)
	}
	return nil

}

func ipv4MulticastLoopback(fd *netFD) (bool, error) {
	// TODO: Implement this
	return false, syscall.EWINDOWS
}

func setIPv4MulticastLoopback(fd *netFD, v bool) error {
	fd.incref()
	defer fd.decref()
	err := syscall.SetsockoptInt(fd.sysfd, syscall.IPPROTO_IP, syscall.IP_MULTICAST_LOOP, boolint(v))
	if err != nil {
		return os.NewSyscallError("setsockopt", err)
	}
	return nil

}

func ipv4ReceiveInterface(fd *netFD) (bool, error) {
	// TODO: Implement this
	return false, syscall.EWINDOWS
}

func setIPv4ReceiveInterface(fd *netFD, v bool) error {
	// TODO: Implement this
	return syscall.EWINDOWS
}

func ipv6TrafficClass(fd *netFD) (int, error) {
	// TODO: Implement this
	return 0, syscall.EWINDOWS
}

func setIPv6TrafficClass(fd *netFD, v int) error {
	// TODO: Implement this
	return syscall.EWINDOWS
}
