package vnet

import (
	"encoding/json"
	"strings"
	"testing"
	"time"

	"github.com/google/uuid"
	"github.com/stretchr/testify/require"
)

func TestVirtualNetworkJsonRoundtrip(t *testing.T) {
	data := `{
		"id":"74fce949-351b-4752-b261-81a56cfd3130",
		"comment":"New York DC1",
		"name":"us-east-1",
		"is_default_network":true,
		"created_at":"2021-11-26T14:40:02.600673Z",
		"deleted_at":"2021-12-01T10:23:13.102645Z"
	}`
	var v VirtualNetwork
	err := json.Unmarshal([]byte(data), &v)

	require.NoError(t, err)
	require.Equal(t, uuid.MustParse("74fce949-351b-4752-b261-81a56cfd3130"), v.ID)
	require.Equal(t, "us-east-1", v.Name)
	require.Equal(t, "New York DC1", v.Comment)
	require.Equal(t, true, v.IsDefault)

	bytes, err := json.Marshal(v)
	require.NoError(t, err)
	obtainedJson := string(bytes)
	data = strings.Replace(data, "\t", "", -1)
	data = strings.Replace(data, "\n", "", -1)
	require.Equal(t, data, obtainedJson)
}

func TestMarshalNewVnet(t *testing.T) {
	newVnet := NewVirtualNetwork{
		Name:      "eu-west-1",
		Comment:   "London office",
		IsDefault: true,
	}

	serialized, err := json.Marshal(newVnet)
	require.NoError(t, err)
	require.True(t, strings.Contains(string(serialized), newVnet.Name))
}

func TestMarshalUpdateVnet(t *testing.T) {
	newName := "bulgaria-1"
	updates := UpdateVirtualNetwork{
		Name: &newName,
	}

	// Test where receiver is struct
	serialized, err := json.Marshal(updates)
	require.NoError(t, err)
	require.True(t, strings.Contains(string(serialized), newName))
}

func TestVnetTableString(t *testing.T) {
	virtualNet := VirtualNetwork{
		ID:        uuid.New(),
		Name:      "us-east-1",
		Comment:   "New York DC1",
		IsDefault: true,
		CreatedAt: time.Now(),
		DeletedAt: time.Time{},
	}

	row := virtualNet.TableString()
	require.True(t, strings.HasPrefix(row, virtualNet.ID.String()))
	require.True(t, strings.Contains(row, virtualNet.Name))
	require.True(t, strings.Contains(row, virtualNet.Comment))
	require.True(t, strings.Contains(row, "true"))
	require.True(t, strings.HasSuffix(row, "-\t"))
}
