package arguments

import (
	"errors"
	"regexp"

	"github.com/diamondburned/arikawa/v2/discord"
)

// (empty) so it matches standard links
// | OR
// canary. matches canary MessageURL
// 3 `(\d+)` for guild ID, channel ID and message ID
var Regex = regexp.MustCompile(
	`https://(ptb\.|canary\.)?discord(?:app)?\.com/channels/(\d+)/(\d+)/(\d+)`,
)

// MessageURL contains info from a MessageURL
type MessageURL struct {
	GuildID   discord.GuildID
	ChannelID discord.ChannelID
	MessageID discord.MessageID
}

func (url *MessageURL) Parse(arg string) error {
	u := ParseMessageURL(arg)
	if u == nil {
		return errors.New("invalid MessageURL format")
	}
	*url = *u
	return nil
}

func (url *MessageURL) Usage() string {
	return "https\u200b://discordapp.com/channels/\\*/\\*/\\*"
}

// ParseMessageURL parses the MessageURL into a smartlink
func ParseMessageURL(url string) *MessageURL {
	ss := Regex.FindAllStringSubmatch(url, -1)
	if ss == nil {
		return nil
	}

	if len(ss) == 0 || len(ss[0]) != 5 {
		return nil
	}

	gID, err1 := discord.ParseSnowflake(ss[0][2])
	cID, err2 := discord.ParseSnowflake(ss[0][3])
	mID, err3 := discord.ParseSnowflake(ss[0][4])

	if err1 != nil || err2 != nil || err3 != nil {
		return nil
	}

	return &MessageURL{
		GuildID:   discord.GuildID(gID),
		ChannelID: discord.ChannelID(cID),
		MessageID: discord.MessageID(mID),
	}
}