// SPDX-License-Identifier: BUSL-1.1
//
// Copyright (C) 2025, Berachain Foundation. All rights reserved.
// Use of this software is governed by the Business Source License included
// in the LICENSE file of this repository and at www.mariadb.com/bsl11.
//
// ANY USE OF THE LICENSED WORK IN VIOLATION OF THIS LICENSE WILL AUTOMATICALLY
// TERMINATE YOUR RIGHTS UNDER THIS LICENSE FOR THE CURRENT AND ALL OTHER
// VERSIONS OF THE LICENSED WORK.
//
// THIS LICENSE DOES NOT GRANT YOU ANY RIGHT IN ANY TRADEMARK OR LOGO OF
// LICENSOR OR ITS AFFILIATES (PROVIDED THAT YOU MAY USE A TRADEMARK OR LOGO OF
// LICENSOR AS EXPRESSLY REQUIRED BY THIS LICENSE).
//
// TO THE EXTENT PERMITTED BY APPLICABLE LAW, THE LICENSED WORK IS PROVIDED ON
// AN “AS IS” BASIS. LICENSOR HEREBY DISCLAIMS ALL WARRANTIES AND CONDITIONS,
// EXPRESS OR IMPLIED, INCLUDING (WITHOUT LIMITATION) WARRANTIES OF
// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, NON-INFRINGEMENT, AND
// TITLE.

package types

import (
	"fmt"

	"github.com/ethereum/go-ethereum/ethclient"
	"github.com/kurtosis-tech/kurtosis/api/golang/core/lib/services"
)

// LoadBalancer represents a group of eth JSON-RPC endpoints
// behind a load balancer which could be either NGINX or blutgang.
type LoadBalancer struct {
	*JSONRPCConnection

	url string
}

func NewLoadBalancer(
	serviceCtx *services.ServiceContext,
) (*LoadBalancer, error) {
	var (
		err  error
		conn = &JSONRPCConnection{}
	)

	// Start by trying to get the public port for the JSON-RPC WebSocket
	port, ok := serviceCtx.GetPublicPorts()["http"]
	if !ok {
		return nil, ErrPublicPortNotFound
	}

	// Then try to connect to the JSON-RPC Endpoint.
	url := fmt.Sprintf("http://0.0.0.0:%d", port.GetNumber())
	if conn.Client, err = ethclient.Dial(url); err != nil {
		return nil, err
	}

	return &LoadBalancer{
		JSONRPCConnection: conn,
		url:               url,
	}, nil
}

// URL returns the URL of the load balancer.
func (lb *LoadBalancer) URL() string {
	return lb.url
}
