// SPDX-FileCopyrightText: 2021 The Go Language Server Authors
// SPDX-License-Identifier: BSD-3-Clause

package protocol

// SelectionRangeProviderOptions selection range provider options interface.
type SelectionRangeProviderOptions any

// SelectionRange represents a selection range represents a part of a selection hierarchy.
//
// A selection range may have a parent selection range that contains it.
//
// @since 3.15.0.
type SelectionRange struct {
	// Range is the Range of this selection range.
	Range Range `json:"range"`

	// Parent is the parent selection range containing this range. Therefore `parent.range` must contain this Range.
	Parent *SelectionRange `json:"parent,omitempty"`
}

// EnableSelectionRange is the whether the selection range.
type EnableSelectionRange bool

// compile time check whether the EnableSelectionRange implements a SelectionRangeProviderOptions interface.
var _ SelectionRangeProviderOptions = (*EnableSelectionRange)(nil)

// Value implements SelectionRangeProviderOptions interface.
func (v EnableSelectionRange) Value() any {
	return bool(v)
}

// NewEnableSelectionRange returns the new EnableSelectionRange underlying types SelectionRangeProviderOptions.
func NewEnableSelectionRange(enable bool) SelectionRangeProviderOptions {
	v := EnableSelectionRange(enable)

	return &v
}

// SelectionRangeOptions is the server capability of selection range.
type SelectionRangeOptions struct {
	WorkDoneProgressOptions
}

// compile time check whether the EnableSelectionRange implements a SelectionRangeProviderOptions interface.
var _ SelectionRangeProviderOptions = (*EnableSelectionRange)(nil)

// Value implements SelectionRangeProviderOptions interface.
func (v *SelectionRangeOptions) Value() any {
	return v
}

// NewSelectionRangeOptions returns the new SelectionRangeOptions underlying types SelectionRangeProviderOptions.
func NewSelectionRangeOptions(enableWorkDoneProgress bool) SelectionRangeProviderOptions {
	v := SelectionRangeOptions{
		WorkDoneProgressOptions: WorkDoneProgressOptions{
			WorkDoneProgress: enableWorkDoneProgress,
		},
	}

	return &v
}

// SelectionRangeRegistrationOptions is the server capability of selection range registration.
type SelectionRangeRegistrationOptions struct {
	SelectionRangeOptions
	TextDocumentRegistrationOptions
	StaticRegistrationOptions
}

// compile time check whether the SelectionRangeRegistrationOptions implements a SelectionRangeProviderOptions interface.
var _ SelectionRangeProviderOptions = (*SelectionRangeRegistrationOptions)(nil)

// Value implements SelectionRangeProviderOptions interface.
func (v *SelectionRangeRegistrationOptions) Value() any {
	return v
}

// NewSelectionRangeRegistrationOptions returns the new SelectionRangeRegistrationOptions underlying types SelectionRangeProviderOptions.
func NewSelectionRangeRegistrationOptions(enableWorkDoneProgress bool, selector DocumentSelector, id string) SelectionRangeProviderOptions {
	v := SelectionRangeRegistrationOptions{
		SelectionRangeOptions: SelectionRangeOptions{
			WorkDoneProgressOptions: WorkDoneProgressOptions{
				WorkDoneProgress: enableWorkDoneProgress,
			},
		},
		TextDocumentRegistrationOptions: TextDocumentRegistrationOptions{
			DocumentSelector: selector,
		},
		StaticRegistrationOptions: StaticRegistrationOptions{
			ID: id,
		},
	}

	return &v
}

// SelectionRangeParams represents a parameter literal used in selection range requests.
//
// @since 3.15.0.
type SelectionRangeParams struct {
	WorkDoneProgressParams
	PartialResultParams

	// TextDocument is the text document.
	TextDocument TextDocumentIdentifier `json:"textDocument"`

	// Positions is the positions inside the text document.
	Positions []Position `json:"positions"`
}
