package indexer import ( "fmt" "sync" "time" "go.uber.org/zap" "github.com/genex/chain-indexer/internal/domain/entity" ) type Indexer struct { logger *zap.Logger lastHeight int64 blocks []entity.Block transactions []entity.ChainTransaction mu sync.RWMutex isRunning bool } func NewIndexer(logger *zap.Logger) *Indexer { return &Indexer{logger: logger} } func (idx *Indexer) Start() { idx.isRunning = true idx.logger.Info("Chain indexer started (mock mode)") go func() { ticker := time.NewTicker(10 * time.Second) defer ticker.Stop() for idx.isRunning { select { case <-ticker.C: idx.mockIndexBlock() } } }() } func (idx *Indexer) Stop() { idx.isRunning = false idx.logger.Info("Chain indexer stopped") } func (idx *Indexer) GetLastHeight() int64 { idx.mu.RLock() defer idx.mu.RUnlock() return idx.lastHeight } func (idx *Indexer) GetRecentBlocks(limit int) []entity.Block { idx.mu.RLock() defer idx.mu.RUnlock() start := len(idx.blocks) - limit if start < 0 { start = 0 } result := make([]entity.Block, len(idx.blocks[start:])) copy(result, idx.blocks[start:]) return result } func (idx *Indexer) mockIndexBlock() { idx.mu.Lock() defer idx.mu.Unlock() idx.lastHeight++ block := entity.Block{ Height: idx.lastHeight, Hash: fmt.Sprintf("0x%064d", idx.lastHeight), Timestamp: time.Now(), TxCount: 0, } idx.blocks = append(idx.blocks, block) // Keep only last 1000 blocks in memory if len(idx.blocks) > 1000 { idx.blocks = idx.blocks[len(idx.blocks)-1000:] } idx.logger.Debug("Indexed mock block", zap.Int64("height", idx.lastHeight)) }