// 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.

// +build !build_with_native_toolchain

package main

import (
	"context"
	"log"
	"syscall/zx"
	"syscall/zx/fidl"

	"go.fuchsia.dev/fuchsia/src/lib/component"

	"fidl/fuchsia/examples"
)

// echoImpl implements the server functionality of the `Echo` protocol.
//
// It holds an `EchoEventProxy` in order to send events to the client.
type echoImpl struct {
	eventSender examples.EchoEventProxy
}

// Assert that `*echoImpl` implements the `EchoWithCtx` interface.
var _ examples.EchoWithCtx = (*echoImpl)(nil)

// EchoString implements the server-side `EchoString` FIDL method. It replies
// with the request value.
func (*echoImpl) EchoString(_ fidl.Context, inValue string) (string, error) {
	log.Println("Received EchoString request", inValue)
	return inValue, nil
}

// SendString implements the server-side `SendString` FIDL method. It sends an
// `OnString` event with the request value.
func (echo *echoImpl) SendString(_ fidl.Context, inValue string) error {
	log.Println("Received SendString request", inValue)
	if err := echo.eventSender.OnString(inValue); err != nil {
		log.Println("Failed to send event:", err)
	}
	// We choose to return nil instead of the event sender error, since we don't
	// want the server to keep running even if it couldn't send the event.
	return nil
}

func main() {
	log.SetFlags(log.Lshortfile)

	ctx := component.NewContextFromStartupInfo()

	ctx.OutgoingService.AddService(
		// Register the service under EchoName. This is the same name that
		// clients will refer to when they connect using ConnectToEnvService
		examples.EchoName,
		// The handler for incoming requests for connecting to Echo. It serves
		// our implementation of Echo on the provided channel
		func(ctx context.Context, c zx.Channel) error {
			stub := examples.EchoWithCtxStub{
				Impl: &echoImpl{
					eventSender: examples.EchoEventProxy(fidl.ChannelProxy{Channel: c}),
				},
			}
			go component.ServeExclusive(ctx, &stub, c, func(err error) {
				log.Println(err)
			})
			return nil
		},
	)

	log.Println("Running echo server")
	// Serve the outgoing directory
	ctx.BindStartupHandle(context.Background())
}
