package ssdp

import (
	"fmt"
	"net"
)

// LocationProvider provides address for Location header which can be reached from
// "from" address network.
type LocationProvider interface {
	// Location provides an address be reachable from the network located
	// by "from" address or "ifi" interface.
	// One of "from" or "ifi" must not be nil.
	Location(from net.Addr, ifi *net.Interface) string
}

// LocationProviderFunc type is an adapter to allow the use of ordinary
// functions are location providers.
type LocationProviderFunc func(net.Addr, *net.Interface) string

func (f LocationProviderFunc) Location(from net.Addr, ifi *net.Interface) string {
	return f(from, ifi)
}

type fixedLocation string

func (s fixedLocation) Location(net.Addr, *net.Interface) string {
	return string(s)
}

func toLocationProvider(v any) (LocationProvider, error) {
	switch w := v.(type) {
	case string:
		return fixedLocation(w), nil
	case LocationProvider:
		return w, nil
	default:
		return nil, fmt.Errorf("location should be a string or a ssdp.LocationProvider but got %T", w)
	}
}
