// Copyright (c) 2017-2026 Lethean (https://lt.hn)
//
// Licensed under the European Union Public Licence (EUPL) version 1.2.
// SPDX-License-Identifier: EUPL-1.2

package rpc

import (
	"encoding/json"
	"net/http"
	"net/http/httptest"
	"testing"
)

func TestGetInfo_Good(t *testing.T) {
	srv := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
		w.Header().Set("Content-Type", "application/json")
		json.NewEncoder(w).Encode(jsonRPCResponse{
			JSONRPC: "2.0",
			ID:      json.RawMessage(`"0"`),
			Result: json.RawMessage(`{
				"height": 6300,
				"tx_count": 12345,
				"tx_pool_size": 3,
				"outgoing_connections_count": 8,
				"incoming_connections_count": 4,
				"synchronized_connections_count": 7,
				"daemon_network_state": 2,
				"pow_difficulty": 1000000,
				"block_reward": 1000000000000,
				"default_fee": 10000000000,
				"minimum_fee": 10000000000,
				"last_block_hash": "abc123",
				"total_coins": "17500000000000000000",
				"pos_allowed": true,
				"status": "OK"
			}`),
		})
	}))
	defer srv.Close()

	c := NewClient(srv.URL)
	info, err := c.GetInfo()
	if err != nil {
		t.Fatalf("GetInfo: %v", err)
	}
	if info.Height != 6300 {
		t.Errorf("height: got %d, want 6300", info.Height)
	}
	if info.TxCount != 12345 {
		t.Errorf("tx_count: got %d, want 12345", info.TxCount)
	}
	if info.BlockReward != 1000000000000 {
		t.Errorf("block_reward: got %d, want 1000000000000", info.BlockReward)
	}
	if !info.PosAllowed {
		t.Error("pos_allowed: got false, want true")
	}
}

func TestGetHeight_Good(t *testing.T) {
	srv := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
		if r.URL.Path != "/getheight" {
			t.Errorf("path: got %s, want /getheight", r.URL.Path)
		}
		w.Header().Set("Content-Type", "application/json")
		w.Write([]byte(`{"height":6300,"status":"OK"}`))
	}))
	defer srv.Close()

	c := NewClient(srv.URL)
	height, err := c.GetHeight()
	if err != nil {
		t.Fatalf("GetHeight: %v", err)
	}
	if height != 6300 {
		t.Errorf("height: got %d, want 6300", height)
	}
}

func TestGetBlockCount_Good(t *testing.T) {
	srv := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
		w.Header().Set("Content-Type", "application/json")
		json.NewEncoder(w).Encode(jsonRPCResponse{
			JSONRPC: "2.0",
			ID:      json.RawMessage(`"0"`),
			Result:  json.RawMessage(`{"count":6301,"status":"OK"}`),
		})
	}))
	defer srv.Close()

	c := NewClient(srv.URL)
	count, err := c.GetBlockCount()
	if err != nil {
		t.Fatalf("GetBlockCount: %v", err)
	}
	if count != 6301 {
		t.Errorf("count: got %d, want 6301", count)
	}
}
