package wakuv2

import (
	"bytes"
	"encoding/json"
	"fmt"
	"net/http"
	"time"

	"github.com/google/uuid"
	"github.com/libp2p/go-libp2p/core/metrics"
	"go.uber.org/zap"
)

type BandwidthTelemetryClient struct {
	serverURL  string
	httpClient *http.Client
	hostID     string
	logger     *zap.Logger
}

func NewBandwidthTelemetryClient(logger *zap.Logger, serverURL string) *BandwidthTelemetryClient {
	return &BandwidthTelemetryClient{
		serverURL:  serverURL,
		httpClient: &http.Client{Timeout: time.Minute},
		hostID:     uuid.NewString(),
		logger:     logger.Named("bandwidth-telemetry"),
	}
}

func (c *BandwidthTelemetryClient) PushProtocolStats(relayStats metrics.Stats, storeStats metrics.Stats) {
	url := fmt.Sprintf("%s/protocol-stats", c.serverURL)
	postBody := map[string]interface{}{
		"hostID": c.hostID,
		"relay": map[string]interface{}{
			"rateIn":   relayStats.RateIn,
			"rateOut":  relayStats.RateOut,
			"totalIn":  relayStats.TotalIn,
			"totalOut": relayStats.TotalOut,
		},
		"store": map[string]interface{}{
			"rateIn":   storeStats.RateIn,
			"rateOut":  storeStats.RateOut,
			"totalIn":  storeStats.TotalIn,
			"totalOut": storeStats.TotalOut,
		},
	}

	body, _ := json.Marshal(postBody)
	_, err := c.httpClient.Post(url, "application/json", bytes.NewBuffer(body))
	if err != nil {
		c.logger.Error("Error sending message to telemetry server", zap.Error(err))
	}
}