package autocorrect

import (
	"regexp"
	"strings"
)

const maxNickLength = 25

var fixNickRegex = regexp.MustCompile(`[\W\s\d]`)

var accountNickRegexes = []*regexp.Regexp{
	regexp.MustCompile(`anilist.co/user/(.*)`),
	regexp.MustCompile(`anilist.co/animelist/(.*)`),
	regexp.MustCompile(`kitsu.io/users/(.*?)/library`),
	regexp.MustCompile(`kitsu.io/users/(.*)`),
	regexp.MustCompile(`anime-planet.com/users/(.*?)/anime`),
	regexp.MustCompile(`anime-planet.com/users/(.*)`),
	regexp.MustCompile(`myanimelist.net/profile/(.*)`),
	regexp.MustCompile(`myanimelist.net/animelist/(.*?)\?`),
	regexp.MustCompile(`myanimelist.net/animelist/(.*)`),
	regexp.MustCompile(`myanimelist.net/(.*)`),
	regexp.MustCompile(`myanimelist.com/(.*)`),
	regexp.MustCompile(`twitter.com/(.*)`),
	regexp.MustCompile(`osu.ppy.sh/u/(.*)`),
}

var animeLinkRegex = regexp.MustCompile(`notify.moe/anime/(\d+)`)
var osuBeatmapRegex = regexp.MustCompile(`osu.ppy.sh/s/(\d+)`)

// Tag converts links to correct tags automatically.
func Tag(tag string) string {
	tag = strings.TrimSpace(tag)
	tag = strings.TrimSuffix(tag, "/")

	// Anime
	matches := animeLinkRegex.FindStringSubmatch(tag)

	if len(matches) > 1 {
		return "anime:" + matches[1]
	}

	// Osu beatmap
	matches = osuBeatmapRegex.FindStringSubmatch(tag)

	if len(matches) > 1 {
		return "osu-beatmap:" + matches[1]
	}

	return tag
}

// UserNick automatically corrects a username.
func UserNick(nick string) string {
	nick = fixNickRegex.ReplaceAllString(nick, "")

	if nick == "" {
		return nick
	}

	nick = strings.Trim(nick, "_")

	if nick == "" {
		return ""
	}

	if len(nick) > maxNickLength {
		nick = nick[:maxNickLength]
	}

	return strings.ToUpper(string(nick[0])) + nick[1:]
}

// AccountNick automatically corrects the username/nick of an account.
func AccountNick(nick string) string {
	for _, regex := range accountNickRegexes {
		matches := regex.FindStringSubmatch(nick)

		if len(matches) > 1 {
			nick = matches[1]
			return nick
		}
	}

	return nick
}

// PostText fixes common mistakes in post texts.
func PostText(text string) string {
	text = strings.ReplaceAll(text, "http://", "https://")
	text = strings.TrimSpace(text)
	return text
}

// ThreadTitle fixes a thread title by trimming spaces.
func ThreadTitle(title string) string {
	return strings.TrimSpace(title)
}

// Website fixed common website mistakes.
func Website(url string) string {
	// Disallow links that aren't actual websites,
	// just tracker links.
	if IsTrackerLink(url) {
		return ""
	}

	url = strings.TrimSpace(url)
	url = strings.TrimPrefix(url, "http://")
	url = strings.TrimPrefix(url, "https://")
	url = strings.TrimSuffix(url, "/")

	return url
}

// IsTrackerLink returns true if the URL is a tracker link.
func IsTrackerLink(url string) bool {
	return strings.Contains(url, "myanimelist.net/") || strings.Contains(url, "anilist.co/") || strings.Contains(url, "kitsu.io/") || strings.Contains(url, "kissanime.")
}