package server

import (
	log "github.com/sirupsen/logrus"
)

type ServerService struct {
	Args *Args
}

type ServerFeatureService struct {
	Args *Args
}

type ServerFeaturesReq struct{}

type ServerFeaturesRes struct {
	Hosts             map[string]string `json:"hosts"`
	Pruning           string            `json:"pruning"`
	ServerVersion     string            `json:"server_version"`
	ProtocolMin       string            `json:"protocol_min"`
	ProtocolMax       string            `json:"protocol_max"`
	GenesisHash       string            `json:"genesis_hash"`
	Description       string            `json:"description"`
	PaymentAddress    string            `json:"payment_address"`
	DonationAddress   string            `json:"donation_address"`
	DailyFee          string            `json:"daily_fee"`
	HashFunction      string            `json:"hash_function"`
	TrendingAlgorithm string            `json:"trending_algorithm"`
}

// Features is the json rpc endpoint for 'server.features'.
func (t *ServerService) Features(req *ServerFeaturesReq, res **ServerFeaturesRes) error {
	log.Println("Features")

	features := &ServerFeaturesRes{
		Hosts:             map[string]string{},
		Pruning:           "",
		ServerVersion:     HUB_PROTOCOL_VERSION,
		ProtocolMin:       PROTOCOL_MIN,
		ProtocolMax:       PROTOCOL_MAX,
		GenesisHash:       t.Args.GenesisHash,
		Description:       t.Args.ServerDescription,
		PaymentAddress:    t.Args.PaymentAddress,
		DonationAddress:   t.Args.DonationAddress,
		DailyFee:          t.Args.DailyFee,
		HashFunction:      "sha256",
		TrendingAlgorithm: "fast_ar",
	}
	*res = features

	return nil
}

type ServerBannerService struct {
	Args *Args
}

type ServerBannerReq struct{}

type ServerBannerRes string

// Banner is the json rpc endpoint for 'server.banner'.
func (t *ServerService) Banner(req *ServerBannerReq, res **ServerBannerRes) error {
	log.Println("Banner")

	*res = (*ServerBannerRes)(t.Args.Banner)

	return nil
}

type ServerVersionService struct {
	Args *Args
}

type ServerVersionReq [2]string // [client_name, client_version]

type ServerVersionRes [2]string // [version, protocol_version]

// Version is the json rpc endpoint for 'server.version'.
func (t *ServerService) Version(req *ServerVersionReq, res **ServerVersionRes) error {
	// FIXME: We may need to do the computation of a negotiated version here.
	// Also return an error if client is not supported?
	result := [2]string{t.Args.ServerVersion, t.Args.ServerVersion}
	*res = (*ServerVersionRes)(&result)
	log.Printf("Version(%v) -> %v", *req, **res)
	return nil
}