package models

import "encoding/xml"

// Key represents a key press command for the /key endpoint
type Key struct {
	XMLName xml.Name `xml:"key"`
	State   string   `xml:"state,attr"`
	Sender  string   `xml:"sender,attr"`
	Value   string   `xml:",chardata"`
}

// KeyState constants for key press states
const (
	KeyStatePress   = "press"
	KeyStateRelease = "release"
)

// KeyValue constants for available keys
const (
	// Playback Controls
	KeyPlay      = "PLAY"
	KeyPause     = "PAUSE"
	KeyStop      = "STOP"
	KeyPrevTrack = "PREV_TRACK"
	KeyNextTrack = "NEXT_TRACK"

	// Rating and Bookmark Controls
	KeyThumbsUp   = "THUMBS_UP"
	KeyThumbsDown = "THUMBS_DOWN"
	KeyBookmark   = "BOOKMARK"

	// Power and System Controls
	KeyPower = "POWER"
	KeyMute  = "MUTE"

	// Volume Controls
	KeyVolumeUp   = "VOLUME_UP"
	KeyVolumeDown = "VOLUME_DOWN"

	// Preset Controls
	KeyPreset1 = "PRESET_1"
	KeyPreset2 = "PRESET_2"
	KeyPreset3 = "PRESET_3"
	KeyPreset4 = "PRESET_4"
	KeyPreset5 = "PRESET_5"
	KeyPreset6 = "PRESET_6"

	// Input Controls
	KeyAuxInput = "AUX_INPUT"

	// Shuffle Controls
	KeyShuffleOff = "SHUFFLE_OFF"
	KeyShuffleOn  = "SHUFFLE_ON"

	// Repeat Controls
	KeyRepeatOff = "REPEAT_OFF"
	KeyRepeatOne = "REPEAT_ONE"
	KeyRepeatAll = "REPEAT_ALL"
)

// NewKey creates a new key press command
// Note: For proper key simulation, use client.SendKey() which sends both press and release
func NewKey(keyValue string) *Key {
	return &Key{
		State:  KeyStatePress,
		Sender: "Gabbo",
		Value:  keyValue,
	}
}

// NewKeyPress creates a new key press command (alias for NewKey)
// Note: This creates only the press state. For complete key simulation, use client.SendKey()
func NewKeyPress(keyValue string) *Key {
	return NewKey(keyValue)
}

// NewKeyRelease creates a new key release command
// Note: This creates only the release state. For complete key simulation, use client.SendKey()
func NewKeyRelease(keyValue string) *Key {
	return &Key{
		State:  KeyStateRelease,
		Sender: "Gabbo",
		Value:  keyValue,
	}
}

// IsValidKey checks if the key value is valid
func IsValidKey(keyValue string) bool {
	validKeys := map[string]bool{
		// Playback Controls
		KeyPlay:      true,
		KeyPause:     true,
		KeyStop:      true,
		KeyPrevTrack: true,
		KeyNextTrack: true,

		// Rating and Bookmark Controls
		KeyThumbsUp:   true,
		KeyThumbsDown: true,
		KeyBookmark:   true,

		// Power and System Controls
		KeyPower: true,
		KeyMute:  true,

		// Volume Controls
		KeyVolumeUp:   true,
		KeyVolumeDown: true,

		// Preset Controls
		KeyPreset1: true,
		KeyPreset2: true,
		KeyPreset3: true,
		KeyPreset4: true,
		KeyPreset5: true,
		KeyPreset6: true,

		// Input Controls
		KeyAuxInput: true,

		// Shuffle Controls
		KeyShuffleOff: true,
		KeyShuffleOn:  true,

		// Repeat Controls
		KeyRepeatOff: true,
		KeyRepeatOne: true,
		KeyRepeatAll: true,
	}

	return validKeys[keyValue]
}

// GetAllValidKeys returns a slice of all valid key values
func GetAllValidKeys() []string {
	return []string{
		// Playback Controls
		KeyPlay,
		KeyPause,
		KeyStop,
		KeyPrevTrack,
		KeyNextTrack,

		// Rating and Bookmark Controls
		KeyThumbsUp,
		KeyThumbsDown,
		KeyBookmark,

		// Power and System Controls
		KeyPower,
		KeyMute,

		// Volume Controls
		KeyVolumeUp,
		KeyVolumeDown,

		// Preset Controls
		KeyPreset1,
		KeyPreset2,
		KeyPreset3,
		KeyPreset4,
		KeyPreset5,
		KeyPreset6,

		// Input Controls
		KeyAuxInput,

		// Shuffle Controls
		KeyShuffleOff,
		KeyShuffleOn,

		// Repeat Controls
		KeyRepeatOff,
		KeyRepeatOne,
		KeyRepeatAll,
	}
}
