package common

import (
	"testing"

	"github.com/alecthomas/assert/v2"
)

func TestParseAndScaleAmount(t *testing.T) {
	tests := []struct {
		name        string
		amount      string
		decimals    string
		want        string
		expectError bool
	}{
		{
			name:        "whole number",
			amount:      "123",
			decimals:    "2",
			want:        "12300",
			expectError: false,
		},
		{
			name:        "decimal number",
			amount:      "123.45",
			decimals:    "2",
			want:        "12345",
			expectError: false,
		},
		{
			name:        "zero decimals",
			amount:      "123.45",
			decimals:    "0",
			want:        "123",
			expectError: false,
		},
		{
			name:        "large number",
			amount:      "1000000.01",
			decimals:    "6",
			want:        "1000000010000",
			expectError: false,
		},
		{
			name:        "invalid amount",
			amount:      "abc",
			decimals:    "2",
			want:        "",
			expectError: true,
		},
		{
			name:        "invalid decimals",
			amount:      "123.45",
			decimals:    "abc",
			want:        "",
			expectError: true,
		},
		{
			name:        "zero amount",
			amount:      "0",
			decimals:    "2",
			want:        "0",
			expectError: false,
		},
	}

	for _, tt := range tests {
		t.Run(tt.name, func(t *testing.T) {
			got, err := ParseAndScaleAmount(tt.amount, tt.decimals)

			// Check error cases
			if tt.expectError {
				if err == nil {
					t.Errorf("ParseAndScaleAmount(%q, %q) expected error, got nil", tt.amount, tt.decimals)
				}
				return
			}

			if err != nil {
				t.Errorf("ParseAndScaleAmount(%q, %q) unexpected error: %v", tt.amount, tt.decimals, err)
				return
			}

			if got != tt.want {
				t.Errorf("ParseAndScaleAmount(%q, %q) = %v, want %v", tt.amount, tt.decimals, got, tt.want)
			}
		})
	}
}

func TestReadTransactionData(t *testing.T) {
	sessionId := "session123"
	publicKey := "0X13242618721"
	ctx, store := InitializeTestDb(t)

	// Test transaction data
	transactionData := map[DataTyp]string{
		DATA_TEMPORARY_VALUE: "0712345678",
		DATA_ACTIVE_SYM:      "SRF",
		DATA_AMOUNT:          "1000000",
		DATA_PUBLIC_KEY:      publicKey,
		DATA_RECIPIENT:       "0x41c188d63Qa",
		DATA_ACTIVE_DECIMAL:  "6",
		DATA_ACTIVE_ADDRESS:  "0xd4c288865Ce",
	}

	// Store the data
	for key, value := range transactionData {
		if err := store.WriteEntry(ctx, sessionId, key, []byte(value)); err != nil {
			t.Fatal(err)
		}
	}

	expectedResult := TransactionData{
		TemporaryValue: "0712345678",
		ActiveSym:      "SRF",
		Amount:         "1000000",
		PublicKey:      publicKey,
		Recipient:      "0x41c188d63Qa",
		ActiveDecimal:  "6",
		ActiveAddress:  "0xd4c288865Ce",
	}

	data, err := ReadTransactionData(ctx, store, sessionId)

	assert.NoError(t, err)
	assert.Equal(t, expectedResult, data)
}