// Copyright 2015 The Vanadium 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 internal

import (
	"sync"

	"v.io/v23/context"
	"v.io/v23/rpc"
	"v.io/x/ref/runtime/internal/rpc/stress"
)

type impl struct {
	statsMu sync.Mutex
	stats   stress.SumStats // GUARDED_BY(statsMu)

	stop chan struct{}
}

func NewService() (stress.StressServerStub, <-chan struct{}) {
	s := &impl{stop: make(chan struct{})}
	return stress.StressServer(s), s.stop
}

func (s *impl) Echo(_ *context.T, _ rpc.ServerCall, payload []byte) ([]byte, error) {
	return payload, nil
}

func (s *impl) Sum(_ *context.T, _ rpc.ServerCall, arg stress.SumArg) ([]byte, error) {
	sum, err := doSum(&arg)
	if err != nil {
		return nil, err
	}
	s.addSumStats(false, uint64(lenSumArg(&arg)), uint64(len(sum)))
	return sum, nil
}

func (s *impl) SumStream(_ *context.T, call stress.StressSumStreamServerCall) error {
	rStream := call.RecvStream()
	sStream := call.SendStream()
	var bytesRecv, bytesSent uint64
	for rStream.Advance() {
		arg := rStream.Value()
		sum, err := doSum(&arg)
		if err != nil {
			return err
		}
		sStream.Send(sum)
		bytesRecv += uint64(lenSumArg(&arg))
		bytesSent += uint64(len(sum))
	}
	if err := rStream.Err(); err != nil {
		return err
	}
	s.addSumStats(true, bytesRecv, bytesSent)
	return nil
}

func (s *impl) addSumStats(stream bool, bytesRecv, bytesSent uint64) {
	s.statsMu.Lock()
	if stream {
		s.stats.SumStreamCount++
	} else {
		s.stats.SumCount++
	}
	s.stats.BytesRecv += bytesRecv
	s.stats.BytesSent += bytesSent
	s.statsMu.Unlock()
}

func (s *impl) GetSumStats(*context.T, rpc.ServerCall) (stress.SumStats, error) {
	s.statsMu.Lock()
	defer s.statsMu.Unlock()
	return s.stats, nil
}

func (s *impl) Stop(*context.T, rpc.ServerCall) error {
	s.stop <- struct{}{}
	return nil
}
