package public

import (
	"cic-dw/pkg/address"
	"context"
	"net/http"

	"github.com/ethereum/go-ethereum/common"
	"github.com/georgysavva/scany/pgxscan"
	"github.com/labstack/echo/v4"
	"github.com/lmittmann/w3"
)

type balanceRes struct {
	TokenSymbol string `json:"symbol"`
	Balance     int64  `json:"balance"`
}

type dbRes struct {
	TokenSymbol  string `db:"token_symbol"`
	TokenAddress string `db:"token_address"`
}

func handleBalancesQuery(c echo.Context) error {
	var (
		api            = c.Get("api").(*api)
		data           []dbRes
		tokenAddresses []common.Address
		res            []balanceRes
	)

	// TODO: return 400
	qAddress, err := address.SarafuAddress(c.Param("address"))
	if err != nil {
		return err
	}

	rows, err := api.db.Query(context.Background(), api.q["all-known-tokens"], qAddress)
	if err != nil {
		return err
	}

	if err := pgxscan.ScanAll(&data, rows); err != nil {
		return err
	}

	for _, rowData := range data {
		tokenAddresses = append(tokenAddresses, w3.A(address.Checksum(rowData.TokenAddress)))
	}

	balances, err := api.bb.TokensBalance(context.Background(), w3.A(address.Checksum(qAddress)), tokenAddresses)
	if err != nil {
		return err
	}

	for i, balance := range balances {
		var d balanceRes

		d.Balance = balance.Int64()
		d.TokenSymbol = data[i].TokenSymbol

		res = append(res, d)
	}

	return c.JSON(http.StatusOK, res)
}