package volume_server_ui

import (
	"bytes"
	"testing"
	"time"

	"github.com/seaweedfs/seaweedfs/weed/stats"
)

func TestStatusTpl(t *testing.T) {
	args := struct {
		Version       string
		Masters       []string
		Volumes       interface{}
		EcVolumes     interface{}
		RemoteVolumes interface{}
		DiskStatuses  interface{}
		Stats         interface{}
		Counters      *stats.ServerStats
	}{
		Version: "3.59",
		Masters: []string{"localhost:9333"},
		EcVolumes: []interface{}{
			struct {
				VolumeId   uint32
				Collection string
				Size       uint64
				Shards     []interface{}
				CreatedAt  time.Time
			}{
				VolumeId:   1,
				Collection: "ectest",
				Size:       8 * 1024 * 1024,
				Shards: []interface{}{
					struct {
						ShardId uint8
						Size    int64
					}{
						ShardId: 4,
						Size:    1024 * 1024,
					},
					struct {
						ShardId uint8
						Size    uint32
					}{
						ShardId: 6,
						Size:    1024 * 1024,
					},
				},
				CreatedAt: time.Now(),
			},
		},
		Counters: stats.NewServerStats(),
	}

	var buf bytes.Buffer
	if err := StatusTpl.Execute(&buf, args); err != nil {
		t.Logf("output: %s", buf.String())
		t.Fatalf("template execution error: %v", err)
	}

	if !bytes.Contains(buf.Bytes(), []byte("8.00 MiB")) {
		t.Errorf("output does not contain formatted volume size '8.00 MiB'")
	}
	if bytes.Count(buf.Bytes(), []byte("1.00 MiB")) != 2 {
		t.Errorf("expected two shards of size '1.00 MiB', but they were not found or not formatted correctly")
	}

	if !bytes.Contains(buf.Bytes(), []byte("Erasure Coding Shards")) {
		t.Errorf("output does not contain 'Erasure Coding Shards'")
	}
	if !bytes.Contains(buf.Bytes(), []byte("ectest")) {
		t.Errorf("output does not contain 'ectest'")
	}
}
