// Copyright 2020 The Fuchsia 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 main

import (
	"context"
	"log"
	"os"

	"github.com/sourcegraph/jsonrpc2"

	"fidl-lsp/analysis"
	"fidl-lsp/langserver"
)

type stdrwc struct{}

func (stdrwc) Read(p []byte) (int, error) {
	return os.Stdin.Read(p)
}

func (stdrwc) Write(p []byte) (int, error) {
	return os.Stdout.Write(p)
}

func (stdrwc) Close() error {
	if err := os.Stdin.Close(); err != nil {
		return err
	}
	return os.Stdout.Close()
}

func main() {
	ctx, cancel := context.WithCancel(context.Background())
	defer cancel()

	trace := log.New(os.Stderr, "[LSP] ", log.Lshortfile)
	logOpt := jsonrpc2.LogMessages(trace)

	fidlProject, err := analysis.GetFidlProject()
	if err != nil {
		trace.Fatalf("Failed to parse fidl_project.json: %s\n", err)
	}

	handler := langserver.NewLangHandler(langserver.NewDefaultConfig(), trace, fidlProject)
	server := langserver.LspServer{handler}

	// Setup a new Conn over stdio
	trace.Println("setting up a new connection")
	conn := jsonrpc2.NewConn(
		ctx,
		jsonrpc2.NewBufferedStream(stdrwc{}, jsonrpc2.VSCodeObjectCodec{}),
		server,
		logOpt,
	)
	defer conn.Close()

	<-conn.DisconnectNotify()
}
