/*******************************************************************************
 * Copyright (c) 2018 1C-Soft LLC.
 *
 * This program and the accompanying materials are made available under
 * the terms of the Eclipse Public License 2.0 which is available at
 * https://www.eclipse.org/legal/epl-2.0/
 *
 * SPDX-License-Identifier: EPL-2.0
 *
 * Contributors:
 *     Vladimir Piskarev (1C) - initial API and implementation
 *******************************************************************************/
package org.eclipse.handly.internal.examples.lsp;

import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.InputStream;
import java.io.PrintStream;
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.Future;

import org.eclipse.lsp4j.InitializeParams;
import org.eclipse.lsp4j.InitializeResult;
import org.eclipse.lsp4j.ServerCapabilities;
import org.eclipse.lsp4j.jsonrpc.Launcher;
import org.eclipse.lsp4j.services.LanguageClient;
import org.eclipse.lsp4j.services.LanguageClientAware;
import org.eclipse.lsp4j.services.LanguageServer;
import org.eclipse.lsp4j.services.TextDocumentService;
import org.eclipse.lsp4j.services.WorkspaceService;

/**
 * Simple implementation of {@link LanguageServer} for use in tests.
 */
class TestLanguageServer
    implements LanguageServer, LanguageClientAware
{
    private ServerCapabilities capabilities = new ServerCapabilities();
    private TextDocumentService textDocumentService;
    private WorkspaceService workspaceService;
    private LanguageClient client;

    /**
     * Starts this language server creating a JSON-RPC connection using
     * standard input and output streams; listens for incoming messages
     * and returns only when the JSON-RPC connection is closed.
     */
    void start()
    {
        InputStream stdin = System.in;
        PrintStream stdout = System.out;
        System.setIn(new ByteArrayInputStream(new byte[0]));
        System.setOut(new PrintStream(new ByteArrayOutputStream()));
        System.setErr(new PrintStream(new ByteArrayOutputStream()));
        Launcher<LanguageClient> launcher = Launcher.createLauncher(this,
            LanguageClient.class, stdin, stdout);
        connect(launcher.getRemoteProxy());
        Future<?> future = launcher.startListening();
        while (!future.isDone())
        {
            try
            {
                Thread.sleep(10000);
            }
            catch (InterruptedException e)
            {
            }
        }
    }

    void setCapabilities(ServerCapabilities capabilities)
    {
        this.capabilities = capabilities;
    }

    void setTextDocumentService(TextDocumentService textDocumentService)
    {
        this.textDocumentService = textDocumentService;
    }

    void setWorkspaceService(WorkspaceService workspaceService)
    {
        this.workspaceService = workspaceService;
    }

    LanguageClient getLanguageClient()
    {
        return client;
    }

    @Override
    public void connect(LanguageClient client)
    {
        this.client = client;
    }

    @Override
    public CompletableFuture<InitializeResult> initialize(
        InitializeParams params)
    {
        return CompletableFuture.completedFuture(new InitializeResult(
            capabilities));
    }

    @Override
    public CompletableFuture<Object> shutdown()
    {
        return CompletableFuture.completedFuture(null);
    }

    @Override
    public void exit()
    {
    }

    @Override
    public TextDocumentService getTextDocumentService()
    {
        return textDocumentService;
    }

    @Override
    public WorkspaceService getWorkspaceService()
    {
        return workspaceService;
    }
}
