extends Channel

signal on_match_set_search_state(msg: MatchSetSearchStateMessage)
signal on_match_found(msg: MatchFoundMessage)
signal on_match_aborted
signal on_match_established(msg: MatchEstablishedMessage)


func get_channel_location() -> String:
	return "matchmaking"


func _process(_delta: float) -> void:
	self.socket.poll()
	if self.socket.get_ready_state() != WebSocketPeer.STATE_OPEN:
		return
	while self.socket.get_available_packet_count():
		var msg := (
			Message
			. deserialize(
				self.socket.get_packet().get_string_from_utf8(),
				[
					MatchSetSearchStateMessage,
					MatchFoundMessage,
					MatchAbortedMessage,
					MatchEstablishedMessage,
				]
			)
		)
		match msg.get_message_id():
			MatchSetSearchStateMessage.MESSAGE_ID:
				on_match_set_search_state.emit(msg)
			MatchFoundMessage.MESSAGE_ID:
				on_match_found.emit(msg)
			MatchAbortedMessage.MESSAGE_ID:
				on_match_aborted.emit()
			MatchEstablishedMessage.MESSAGE_ID:
				on_match_established.emit(msg)
			_:
				continue


func send_search_state(searching: bool) -> void:
	if self.socket.get_ready_state() != WebSocketPeer.STATE_OPEN:
		return
	var msg := MatchSetSearchStateMessage.new()
	msg.searching = searching
	self.socket.send_text(Message.serialize(msg))


func send_match_accepted(accepted: bool, match_id: String) -> void:
	if self.socket.get_ready_state() != WebSocketPeer.STATE_OPEN:
		return
	var msg := MatchAcceptedMessage.new()
	msg.accepted = accepted
	msg.matchId = match_id
	self.socket.send_text(Message.serialize(msg))