package adapter

import (
	"context"
	"net"

	N "github.com/sagernet/sing/common/network"
)

type ClashServer interface {
	Service
	Mode() string
	StoreSelected() bool
	CacheFile() ClashCacheFile
	RoutedConnection(ctx context.Context, conn net.Conn, metadata InboundContext, matchedRule Rule) (net.Conn, Tracker)
	RoutedPacketConnection(ctx context.Context, conn N.PacketConn, metadata InboundContext, matchedRule Rule) (N.PacketConn, Tracker)
}

type ClashCacheFile interface {
	LoadSelected(group string) string
	StoreSelected(group string, selected string) error
}

type Tracker interface {
	Leave()
}

type OutboundGroup interface {
	Now() string
	All() []string
}

func OutboundTag(detour Outbound) string {
	if group, isGroup := detour.(OutboundGroup); isGroup {
		return group.Now()
	}
	return detour.Tag()
}