// Package deeplink builds and parses the Telegram Mini App "start parameters" that
// route a launch to a specific destination. The scheme is shared verbatim with the
// UI (ui/src/lib/deeplink.ts): a one-character kind prefix followed by a value —
//
//	g<game uuid>        open that game
//	i<invitation uuid>  open that invitation
//	f<6-digit code>     redeem that friend code
//
// An empty or unrecognised parameter opens the lobby. UUIDs keep their dashes,
// which are allowed in a Telegram startapp parameter ([A-Za-z0-9_-]).
package deeplink

import "strings"

// Kind prefixes for the start-parameter scheme.
const (
	prefixGame       = "g"
	prefixInvitation = "i"
	prefixFriendCode = "f"
)

// Kind classifies a start parameter.
type Kind int

// The start-parameter kinds.
const (
	KindLobby Kind = iota
	KindGame
	KindInvitation
	KindFriendCode
)

// Game returns the start parameter that opens the game with the given id.
func Game(id string) string { return prefixGame + id }

// Invitation returns the start parameter that opens the invitation with the id.
func Invitation(id string) string { return prefixInvitation + id }

// FriendCode returns the start parameter that redeems the given friend code.
func FriendCode(code string) string { return prefixFriendCode + code }

// Parse classifies a start parameter and returns its value (the part after the
// kind prefix). An empty or unrecognised parameter is KindLobby with an empty
// value.
func Parse(p string) (Kind, string) {
	switch {
	case strings.HasPrefix(p, prefixGame):
		return KindGame, p[len(prefixGame):]
	case strings.HasPrefix(p, prefixInvitation):
		return KindInvitation, p[len(prefixInvitation):]
	case strings.HasPrefix(p, prefixFriendCode):
		return KindFriendCode, p[len(prefixFriendCode):]
	default:
		return KindLobby, ""
	}
}
