package cnvrt

import (
	"context"
	cnvrtv1 "github.com/netscrawler/protoss/gen/go/changeAPI"
	"google.golang.org/grpc"
	"google.golang.org/grpc/codes"
	"google.golang.org/grpc/status"
)

type Converter interface {
	Convert(ctx context.Context,
		amount uint32,
		targetCurrency string,
	) (convertedAmount uint32, rate float32, err error)
}

type serverAPI struct {
	cnvrtv1.UnimplementedConverterServer
	convert Converter
}

func Register(gRPC *grpc.Server, convert Converter) {
	cnvrtv1.RegisterConverterServer(gRPC, &serverAPI{convert: convert})
}

func (s *serverAPI) Convert(
	ctx context.Context,
	req *cnvrtv1.ConvertRequest) (
	*cnvrtv1.ConvertResponse, error) {
	if !isValidCurrency(req.GetTargetCurrency()) {
		return nil, status.Error(codes.InvalidArgument, "Invalid target currency")
	}

	convertedAmount, rate, err := s.convert.Convert(ctx, req.GetAmount(), req.GetTargetCurrency())
	if err != nil {
		//todo error handler
		return nil, status.Error(codes.Internal, "Internal error")
	}
	return &cnvrtv1.ConvertResponse{
		BaseAmount:        req.GetAmount(),
		ConvertedAmount:   convertedAmount,
		ConvertedCurrency: req.GetTargetCurrency(),
		Rate:              rate,
	}, nil
}

func isValidCurrency(currency string) bool {

	currencies := map[string]bool{
		"AUD": true, "GBP": true, "BYR": true, "DKK": true, "USD": true, "EUR": true,
		"ISK": true, "KZT": true, "CAD": true, "NOK": true, "XDR": true, "SGD": true,
		"TRL": true, "UAH": true, "SEK": true, "CHF": true, "JPY": true,
	}
	if currencies[currency] {
		return true
	}
	return false
}