package Perl::LanguageServer::Methods ;

use Moose::Role ;
use JSON ;
use Data::Dump qw{pp} ;

no warnings 'uninitialized' ;

# ---------------------------------------------------------------------------

sub _rpcreq_initialize
    {
    my ($self, $workspace, $req) = @_ ;

    #print STDERR "Call initialize\n" ;
    $self -> logger ("initialize ", $Perl::LanguageServer::jsonpretty -> encode ($req -> params), "\n")
        if ($Perl::LanguageServer::debug1) ;

    $Perl::LanguageServer::workspace = Perl::LanguageServer::Workspace -> new ({ config => $req -> params }) ;

    my $caps =
        {
        # Defines how text documents are synced. Is either a detailed structure defining each notification or
        # for backwards compatibility the TextDocumentSyncKind number. If omitted it defaults to `TextDocumentSyncKind.None`.
        textDocumentSync => 1, # full

        # The server provides hover support.
        #hoverProvider?: boolean;

        # The server provides completion support.
        #completionProvider?: CompletionOptions;

        # The server provides signature help support.
        #signatureHelpProvider?: SignatureHelpOptions;
        signatureHelpProvider =>
            {
            triggerCharacters => ['('],
            },

        # The server provides goto definition support.
        #definitionProvider?: boolean;
        definitionProvider => JSON::true,

        # The server provides Goto Type Definition support.
        # Since 3.6.0
        #typeDefinitionProvider?: boolean | (TextDocumentRegistrationOptions & StaticRegistrationOptions);

        # The server provides Goto Implementation support.
        # Since 3.6.0
        #implementationProvider?: boolean | (TextDocumentRegistrationOptions & StaticRegistrationOptions);

        # The server provides find references support.
        referencesProvider => JSON::true,

        # The server provides document highlight support.
        #documentHighlightProvider?: boolean;

        # The server provides document symbol support.
        #documentSymbolProvider?: boolean;
        documentSymbolProvider => JSON::true,

        # The server provides workspace symbol support.
        workspaceSymbolProvider => JSON::true,

        # The server provides code actions.
        #codeActionProvider?: boolean;

        # The server provides code lens.
        #codeLensProvider?: CodeLensOptions;

        # The server provides document formatting.
        #documentFormattingProvider?: boolean;
        #documentFormattingProvider => JSON::true,

        # The server provides document range formatting.
        #documentRangeFormattingProvider?: boolean;
        documentRangeFormattingProvider => JSON::true,

        # The server provides document formatting on typing.
        #documentOnTypeFormattingProvider?: DocumentOnTypeFormattingOptions;

        # The server provides rename support.
        #renameProvider?: boolean;

        # The server provides document link support.
        #documentLinkProvider?: DocumentLinkOptions;

        # The server provides color provider support.
        # Since 3.6.0
        #colorProvider?: boolean | ColorProviderOptions | (ColorProviderOptions & TextDocumentRegistrationOptions & StaticRegistrationOptions);

        # The server provides execute command support.
        #executeCommandProvider?: ExecuteCommandOptions;

        # The server provides selection range support.
        # @since 3.15.0
        # selectionRangeProvider?: boolean | SelectionRangeOptions | SelectionRangeRegistrationOptions;

        #selectionRangeProvider => JSON::true,

        # Workspace specific server capabilities
        workspace => {

            # The server supports workspace folder.
            # Since 3.6.0
            workspaceFolders => {

            # The server has support for workspace folders
            supported => JSON::true,

            # * Whether the server wants to receive workspace folder
            # * change notifications.
            # *
            # * If a strings is provided the string is treated as a ID
            # * under which the notification is registered on the client
            # * side. The ID can be used to unregister for these events
            # * using the `client/unregisterCapability` request.
            # */
            changeNotifications => JSON::true,
            }
        }

        # Experimental server capabilities.
        #experimental?: any;
        } ;

    return { capabilities => $caps } ;
    }


# ---------------------------------------------------------------------------

sub _rpcnot_initialized
    {
    my ($self, $workspace, $req) = @_ ;

    return if (!$Perl::LanguageServer::client_version) ;

    if ($Perl::LanguageServer::client_version ne $Perl::LanguageServer::VERSION)
        {
        my $msg = "Version of IDE/Editor plugin is $Perl::LanguageServer::client_version\nVersion of Perl::LanguageServer is $Perl::LanguageServer::VERSION\nPlease make sure you run matching versions of the plugin and the Perl::LanguageServer module\nUse 'cpan Perl::LanguageServer' to install the newest version of the Perl::LanguageServer module\n" ;
        $self -> logger ("\n$msg\n") ;
        }
    return ;
    }


# ---------------------------------------------------------------------------

sub _rpcnot_cancelRequest
    {
    my ($self, $workspace, $req) = @_ ;

    my $cancel_id = $req -> params -> {id} ;
    return if (!$cancel_id) ;
    return if (!exists $Perl::LanguageServer::running_req{$cancel_id}) ;
    $Perl::LanguageServer::running_req{$cancel_id} -> cancel_req ;

    return ;
    }

# ---------------------------------------------------------------------------

sub _rpcreq_shutdown
    {
    my ($self, $workspace, $req) = @_ ;

    return if (!$workspace) ;

    $workspace -> shutdown ;
    }

# ---------------------------------------------------------------------------

sub _rpcnot_exit
    {
    my ($self, $workspace, $req) = @_ ;

    print STDERR "Exit\n" ;

    exit (1) if (!$workspace) ;
    exit (1) if (!$workspace -> is_shutdown) ;
    exit (0) ;
    return ;
    }

# ---------------------------------------------------------------------------

1 ;