package gateway

import "encoding/json"

// Event type constants.
const (
	EventMessageCreate  = "MESSAGE_CREATE"
	EventMessageUpdate  = "MESSAGE_UPDATE"
	EventMessageDelete  = "MESSAGE_DELETE"
	EventChannelCreate  = "CHANNEL_CREATE"
	EventChannelUpdate  = "CHANNEL_UPDATE"
	EventChannelDelete  = "CHANNEL_DELETE"
	EventMemberAdd      = "SERVER_MEMBER_ADD"
	EventMemberRemove   = "SERVER_MEMBER_REMOVE"
	EventPresenceUpdate = "PRESENCE_UPDATE"
	EventTypingStart    = "TYPING_START"
	EventReactionAdd    = "REACTION_ADD"
	EventReactionRemove = "REACTION_REMOVE"
	EventBotJoin        = "BOT_JOIN"
	EventBotLeave       = "BOT_LEAVE"
	EventVoiceJoin      = "VOICE_JOIN"
	EventVoiceLeave     = "VOICE_LEAVE"
	EventVoiceMute      = "VOICE_MUTE"
	EventVoiceDeafen    = "VOICE_DEAFEN"
	EventVoiceWhisper   = "VOICE_WHISPER"
)

// Event represents a WebSocket event sent to clients.
type Event struct {
	Type string      `json:"type"`
	Data interface{} `json:"data,omitempty"`
}

// MarshalJSON implements custom JSON marshaling for Event.
func (e Event) MarshalJSON() ([]byte, error) {
	type eventAlias struct {
		Type string      `json:"type"`
		Data interface{} `json:"data,omitempty"`
	}
	return json.Marshal(eventAlias{
		Type: e.Type,
		Data: e.Data,
	})
}

// UnmarshalJSON implements custom JSON unmarshaling for Event.
func (e *Event) UnmarshalJSON(data []byte) error {
	type eventAlias struct {
		Type string          `json:"type"`
		Data json.RawMessage `json:"data,omitempty"`
	}
	var raw eventAlias
	if err := json.Unmarshal(data, &raw); err != nil {
		return err
	}
	e.Type = raw.Type
	e.Data = raw.Data
	return nil
}
