// Copyright (C) 2019-2025, Lux Industries Inc. All rights reserved.
// See the file LICENSE for licensing terms.

package execute

import (
	"context"
	"errors"

	"github.com/luxfi/database"
	"github.com/luxfi/node/vms/example/xsvm/state"
	"github.com/luxfi/runtime"

	xsblock "github.com/luxfi/node/vms/example/xsvm/block"
)

var errNoTxs = errors.New("no transactions")

func Block(
	ctx context.Context,
	chainRuntime *runtime.Runtime,
	db database.KeyValueReaderWriterDeleter,
	skipVerify bool,
	blockContext *runtime.Runtime,
	blk *xsblock.Stateless,
) error {
	if len(blk.Txs) == 0 {
		return errNoTxs
	}

	for _, currentTx := range blk.Txs {
		txID, err := currentTx.ID()
		if err != nil {
			return err
		}
		sender, err := currentTx.SenderID()
		if err != nil {
			return err
		}
		txExecutor := Tx{
			Context:      ctx,
			Runtime:      chainRuntime,
			Database:     db,
			SkipVerify:   skipVerify,
			BlockContext: blockContext,
			TxID:         txID,
			Sender:       sender,
		}
		if err := currentTx.Unsigned.Visit(&txExecutor); err != nil {
			return err
		}
	}

	blkID, err := blk.ID()
	if err != nil {
		return err
	}

	if err := state.SetLastAccepted(db, blkID); err != nil {
		return err
	}

	blkBytes, err := xsblock.Codec.Marshal(xsblock.CodecVersion, blk)
	if err != nil {
		return err
	}

	return state.AddBlock(db, blk.Height, blkID, blkBytes)
}
