package events

import (
	"context"
	"sync"

	lru "github.com/hashicorp/golang-lru"
	"github.com/ipfs/go-cid"

	"github.com/filecoin-project/lotus/api"
)

type messageCache struct {
	api EventAPI

	blockMsgLk    sync.Mutex
	blockMsgCache *lru.ARCCache
}

func newMessageCache(api EventAPI) *messageCache {
	blsMsgCache, _ := lru.NewARC(500)

	return &messageCache{
		api:           api,
		blockMsgCache: blsMsgCache,
	}
}

func (c *messageCache) ChainGetBlockMessages(ctx context.Context, blkCid cid.Cid) (*api.BlockMessages, error) {
	c.blockMsgLk.Lock()
	defer c.blockMsgLk.Unlock()

	msgsI, ok := c.blockMsgCache.Get(blkCid)
	var err error
	if !ok {
		msgsI, err = c.api.ChainGetBlockMessages(ctx, blkCid)
		if err != nil {
			return nil, err
		}
		c.blockMsgCache.Add(blkCid, msgsI)
	}
	return msgsI.(*api.BlockMessages), nil
}