// Copyright 2019 The Go Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.

package parse

import (
	"log"

	p "golang.org/x/tools/internal/lsp/protocol"
)

// Requests and notifications are fixed types
// Responses may be one of several types

// Requests returns a pointer to a type suitable for Unmarshal
func Requests(m string) interface{} {
	// these are in the documentation's order
	switch m {
	case "initialize":
		return new(p.InitializeParams)
	case "shutdown":
		return new(struct{})
	case "window/showMessgeRequest":
		return new(p.ShowMessageRequestParams)
	case "client/registerCapability":
		return new(p.RegistrationParams)
	case "client/unregisterCapability":
		return new(p.UnregistrationParams)
	case "workspace/workspaceFolders":
		return nil
	case "workspace/configuration":
		return new(p.ConfigurationParams)
	case "workspace/symbol":
		return new(p.WorkspaceSymbolParams)
	case "workspace/executeCommand":
		return new(p.ExecuteCommandParams)
	case "workspace/applyEdit":
		return new(p.ApplyWorkspaceEditParams)
	case "textDocument/willSaveWaitUntil":
		return new(p.WillSaveTextDocumentParams)
	case "textDocument/completion":
		return new(p.CompletionParams)
	case "completionItem/resolve":
		return new(p.CompletionItem)
	case "textDocument/hover":
		return new(p.TextDocumentPositionParams)
	case "textDocument/signatureHelp":
		return new(p.TextDocumentPositionParams)
	case "textDocument/declaration":
		return new(p.TextDocumentPositionParams)
	case "textDocument/definition":
		return new(p.TextDocumentPositionParams)
	case "textDocument/typeDefinition":
		return new(p.TextDocumentPositionParams)
	case "textDocument/implementation":
		return new(p.TextDocumentPositionParams)
	case "textDocument/references":
		return new(p.ReferenceParams)
	case "textDocument/documentHighlight":
		return new(p.TextDocumentPositionParams)
	case "textDocument/documentSymbol":
		return new(p.DocumentSymbolParams)
	case "textDocument/codeAction":
		return new(p.CodeActionParams)
	case "textDocument/codeLens":
		return new(p.CodeLensParams)
	case "codeLens/resolve":
		return new(p.CodeLens)
	case "textDocument/documentLink":
		return new(p.DocumentLinkParams)
	case "documentLink/resolve":
		return new(p.DocumentLink)
	case "textDocument/documentColor":
		return new(p.DocumentColorParams)
	case "textDocument/colorPressentation":
		return new(p.ColorPresentationParams)
	case "textDocument/formatting":
		return new(p.DocumentFormattingParams)
	case "textDocument/rangeFormatting":
		return new(p.DocumentRangeFormattingParams)
	case "textDocument/typeFormatting":
		return new(p.DocumentOnTypeFormattingParams)
	case "textDocument/rename":
		return new(p.RenameParams)
	case "textDocument/prepareRename":
		return new(p.TextDocumentPositionParams)
	case "textDocument/foldingRange":
		return new(p.FoldingRangeParams)
	case "textDocument/incomingCalls":
		return new(p.CallHierarchyIncomingCallsParams)
	case "textDocument/outgoingCalls":
		return new(p.CallHierarchyOutgoingCallsParams)
	}
	log.Fatalf("request(%s) undefined", m)
	return ""
}

// Notifs returns a pointer to a type suitable for Unmarshal
func Notifs(m string) interface{} {
	switch m {
	case "$/cancelRequest":
		return new(p.CancelParams)
	case "$/setTraceNotification":
		return new(struct{ Value string })
	case "client/registerCapability": // why is this a notification? (serer->client rpc)
		return new(p.RegistrationParams)
	case "initialized":
		return new(p.InitializedParams)
	case "exit":
		return nil
	case "window/showMessage":
		return new(p.ShowMessageParams)
	case "window/logMessage":
		return new(p.LogMessageParams)
	case "telemetry/event":
		return new(interface{}) // any
	case "workspace/didChangeWorkspaceFolders":
		return new(p.DidChangeWorkspaceFoldersParams)
	case "workspace/didChangeConfiguration":
		return new(p.DidChangeConfigurationParams)
	case "workspace/didChangeWatchedFiles":
		return new(p.DidChangeWatchedFilesParams)
	case "textDocument/didOpen":
		return new(p.DidOpenTextDocumentParams)
	case "textDocument/didChange":
		return new(p.DidChangeTextDocumentParams)
	case "textDocument/willSave":
		return new(p.WillSaveTextDocumentParams)
	case "textDocument/didSave":
		return new(p.DidSaveTextDocumentParams)
	case "textDocument/didClose":
		return new(p.DidCloseTextDocumentParams)
	case "textDocument/willClose":
		return new(p.DidCloseTextDocumentParams)
	case "textDocument/publishDiagnostics":
		return new(p.PublishDiagnosticsParams)
	}
	log.Fatalf("notif(%s) undefined", m)
	return ""
}

// Responses returns a slice of types, one of which should be
// suitable for Unmarshal
func Responses(m string) []interface{} {
	switch m {
	case "initialize":
		return []interface{}{new(p.InitializeResult)}
	case "shutdown":
		return []interface{}{nil}
	case "window/showMessageRequest":
		return []interface{}{new(p.MessageActionItem), nil}
	case "client/registerCapability":
		return []interface{}{nil}
	case "client/unregisterCapability":
		return []interface{}{nil}
	case "workspace/workspaceFolder":
		return []interface{}{new([]p.WorkspaceFolder), nil}
	case "workspace/configuration":
		return []interface{}{new([]interface{}), new(interface{})}
	case "workspace/symbol":
		return []interface{}{new([]p.SymbolInformation), nil}
	case "workspace/executeCommand":
		return []interface{}{new(interface{}), nil}
	case "workspace/applyEdit":
		return []interface{}{new(p.ApplyWorkspaceEditResponse)}
	case "textDocument/willSaveWaitUntil":
		return []interface{}{new([]p.TextEdit), nil}
	case "textDocument/completion":
		return []interface{}{new(p.CompletionList), new([]p.CompletionItem), nil}
	case "completionItem/resolve":
		return []interface{}{new(p.CompletionItem)}
	case "textDocument/hover":
		return []interface{}{new(p.Hover), nil}
	case "textDocument/signatureHelp":
		return []interface{}{new(p.SignatureHelp), nil}
	case "textDocument/declaration":
		return []interface{}{new(p.Location), new([]p.Location), new([]p.LocationLink), nil}
	case "textDocument/definition":
		return []interface{}{new([]p.Location), new([]p.Location), new([]p.LocationLink), nil}
	case "textDocument/typeDefinition":
		return []interface{}{new([]p.Location), new([]p.LocationLink), new(p.Location), nil}
	case "textDocument/implementation":
		return []interface{}{new(p.Location), new([]p.Location), new([]p.LocationLink), nil}
	case "textDocument/references":
		return []interface{}{new([]p.Location), nil}
	case "textDocument/documentHighlight":
		return []interface{}{new([]p.DocumentHighlight), nil}
	case "textDocument/documentSymbol":
		return []interface{}{new([]p.DocumentSymbol), new([]p.SymbolInformation), nil}
	case "textDocument/codeAction":
		return []interface{}{new([]p.CodeAction), new(p.Command), nil}
	case "textDocument/codeLens":
		return []interface{}{new([]p.CodeLens), nil}
	case "codelens/resolve":
		return []interface{}{new(p.CodeLens)}
	case "textDocument/documentLink":
		return []interface{}{new([]p.DocumentLink), nil}
	case "documentLink/resolve":
		return []interface{}{new(p.DocumentLink)}
	case "textDocument/documentColor":
		return []interface{}{new([]p.ColorInformation)}
	case "textDocument/colorPresentation":
		return []interface{}{new([]p.ColorPresentation)}
	case "textDocument/formatting":
		return []interface{}{new([]p.TextEdit), nil}
	case "textDocument/rangeFormatting":
		return []interface{}{new([]p.TextEdit), nil}
	case "textDocument/onTypeFormatting":
		return []interface{}{new([]p.TextEdit), nil}
	case "textDocument/rename":
		return []interface{}{new(p.WorkspaceEdit), nil}
	case "textDocument/prepareRename":
		return []interface{}{new(p.Range), nil}
	case "textDocument/foldingRange":
		return []interface{}{new([]p.FoldingRange), nil}
	case "callHierarchy/incomingCalls":
		return []interface{}{new([]p.CallHierarchyIncomingCall), nil}
	case "callHierarchy/outgoingCalls":
		return []interface{}{new([]p.CallHierarchyOutgoingCall), nil}
	}
	log.Fatalf("responses(%q) undefined", m)
	return nil
}

// Msgtype given method names. Note that mSrv|mCl is possible
type Msgtype int

const (
	// Mnot for notifications
	Mnot Msgtype = 1
	// Mreq for requests
	Mreq Msgtype = 2
	// Msrv for messages from the server
	Msrv Msgtype = 4
	// Mcl for messages from the client
	Mcl Msgtype = 8
)

// IsNotify says if the message is a notification
func IsNotify(msg string) bool {
	m, ok := fromMethod[msg]
	if !ok {
		log.Fatalf("%q", msg)
	}
	return m&Mnot != 0
}

// FromServer says if the message is from the server
func FromServer(msg string) bool {
	m, ok := fromMethod[msg]
	if !ok {
		log.Fatalf("%q", msg)
	}
	return m&Msrv != 0
}

// FromClient says if the message is from the client
func FromClient(msg string) bool {
	m, ok := fromMethod[msg]
	if !ok {
		log.Fatalf("%q", msg)
	}
	return m&Mcl != 0
}

// rpc name to message type
var fromMethod = map[string]Msgtype{
	"$/cancelRequest":             Mnot | Msrv | Mcl,
	"initialize":                  Mreq | Msrv,
	"initialized":                 Mnot | Mcl,
	"shutdown":                    Mreq | Mcl,
	"exit":                        Mnot | Mcl,
	"window/showMessage":          Mreq | Msrv,
	"window/logMessage":           Mnot | Msrv,
	"telemetry'event":             Mnot | Msrv,
	"client/registerCapability":   Mreq | Msrv,
	"client/unregisterCapability": Mreq | Msrv,
	"workspace/workspaceFolders":  Mreq | Msrv,
	"workspace/workspaceDidChangeWorkspaceFolders": Mnot | Mcl,
	"workspace/didChangeConfiguration":             Mnot | Mcl,
	"workspace/configuration":                      Mreq | Msrv,
	"workspace/didChangeWatchedFiles":              Mnot | Mcl,
	"workspace/symbol":                             Mreq | Mcl,
	"workspace/executeCommand":                     Mreq | Mcl,
	"workspace/applyEdit":                          Mreq | Msrv,
	"textDocument/didOpen":                         Mnot | Mcl,
	"textDocument/didChange":                       Mnot | Mcl,
	"textDocument/willSave":                        Mnot | Mcl,
	"textDocument/willSaveWaitUntil":               Mreq | Mcl,
	"textDocument/didSave":                         Mnot | Mcl,
	"textDocument/didClose":                        Mnot | Mcl,
	"textDocument/publishDiagnostics":              Mnot | Msrv,
	"textDocument/completion":                      Mreq | Mcl,
	"completionItem/resolve":                       Mreq | Mcl,
	"textDocument/hover":                           Mreq | Mcl,
	"textDocument/signatureHelp":                   Mreq | Mcl,
	"textDocument/declaration":                     Mreq | Mcl,
	"textDocument/definition":                      Mreq | Mcl,
	"textDocument/typeDefinition":                  Mreq | Mcl,
	"textDocument/implementation":                  Mreq | Mcl,
	"textDocument/references":                      Mreq | Mcl,
	"textDocument/documentHighlight":               Mreq | Mcl,
	"textDocument/documentSymbol":                  Mreq | Mcl,
	"textDocument/codeAction":                      Mreq | Mcl,
	"textDocument/codeLens":                        Mreq | Mcl,
	"codeLens/resolve":                             Mreq | Mcl,
	"textDocument/documentLink":                    Mreq | Mcl,
	"documentLink/resolve":                         Mreq | Mcl,
	"textDocument/documentColor":                   Mreq | Mcl,
	"textDocument/colorPresentation":               Mreq | Mcl,
	"textDocument/formatting":                      Mreq | Mcl,
	"textDocument/rangeFormatting":                 Mreq | Mcl,
	"textDocument/onTypeFormatting":                Mreq | Mcl,
	"textDocument/rename":                          Mreq | Mcl,
	"textDocument/prepareRename":                   Mreq | Mcl,
	"textDocument/foldingRange":                    Mreq | Mcl,
	"callHierarchy/incomingCalls":                  Mreq | Mcl,
	"callHierarchy/outgoingCalls":                  Mreq | Mcl,
}
