package pusher

// Channel tracks the local connections subscribed on this pod.
// State is only mutated by the Hub goroutine, so no locks are needed.
type Channel struct {
	id      string
	members map[*Conn]string // conn → humanID
}

func newChannel(id string) *Channel {
	return &Channel{
		id:      id,
		members: make(map[*Conn]string),
	}
}

func (ch *Channel) addMember(conn *Conn, humanID string) {
	ch.members[conn] = humanID
}

func (ch *Channel) removeMember(conn *Conn) {
	delete(ch.members, conn)
}

func (ch *Channel) isEmpty() bool {
	return len(ch.members) == 0
}

// Deduplicated set; the same human may have multiple connections.
func (ch *Channel) localHumanIDs() []string {
	seen := make(map[string]bool, len(ch.members))
	ids := make([]string, 0, len(ch.members))
	for _, hid := range ch.members {
		if !seen[hid] {
			seen[hid] = true
			ids = append(ids, hid)
		}
	}
	return ids
}

func (ch *Channel) hasHumanID(humanID string) bool {
	for _, hid := range ch.members {
		if hid == humanID {
			return true
		}
	}
	return false
}

func (ch *Channel) broadcast(msg ServerMessage, exclude *Conn) {
	for conn := range ch.members {
		if conn != exclude {
			conn.Send(msg)
		}
	}
}
