//go:build !sonic

package nostr

import (
	"errors"
	"strings"
)

func NewMessageParser() MessageParser {
	return messageParser{}
}

type messageParser struct{}

func (messageParser) ParseMessage(message string) (Envelope, error) {
	firstQuote := strings.IndexRune(message, '"')
	if firstQuote == -1 {
		return nil, errors.New("malformed json")
	}
	secondQuote := strings.IndexRune(message[firstQuote+1:], '"')
	if secondQuote == -1 {
		return nil, errors.New("malformed json")
	}
	label := message[firstQuote+1 : firstQuote+1+secondQuote]

	var v Envelope
	switch label {
	case "EVENT":
		v = &EventEnvelope{}
	case "REQ":
		v = &ReqEnvelope{}
	case "COUNT":
		v = &CountEnvelope{}
	case "NOTICE":
		x := NoticeEnvelope("")
		v = &x
	case "EOSE":
		x := EOSEEnvelope("")
		v = &x
	case "OK":
		v = &OKEnvelope{}
	case "AUTH":
		v = &AuthEnvelope{}
	case "CLOSED":
		v = &ClosedEnvelope{}
	case "CLOSE":
		x := CloseEnvelope("")
		v = &x
	default:
		return nil, UnknownLabel
	}

	if err := v.FromJSON(message); err != nil {
		return nil, err
	}
	return v, nil
}