// SPDX-FileCopyrightText: 2026 Romain Maneschi <romain@gitroot.dev>
//
// SPDX-License-Identifier: EUPL-1.2

package iterator

import (
	"errors"

	"gitroot.dev/libs/golang/plugin/model"
	plugin "gitroot.dev/libs/golang/plugin/model"
	"gitroot.dev/server/logger"
)

type Manager struct {
	logger    logger.Logger
	iterators map[string]*pullIterator
}

func NewManager() *Manager {
	return &Manager{
		logger:    *logger.NewLogger(logger.ITERATOR),
		iterators: map[string]*pullIterator{},
	}
}

func (m *Manager) Add(name string, slice []any) *pullIterator {
	m.iterators[name] = NewPullIterator(slice)
	return m.iterators[name]
}

// TODO: WTH!? go refuse a []model.Report as a []any
func (m *Manager) AddReports(name string, slice []model.Report) *pullIterator {
	sliceAny := make([]any, len(slice))
	for i, s := range slice {
		sliceAny[i] = s
	}
	m.iterators[name] = NewPullIterator(sliceAny)
	return m.iterators[name]
}

func (m *Manager) Next(name string) plugin.IteratorItem {
	if it, ok := m.iterators[name]; ok {
		item, ok := it.Next()
		return plugin.IteratorItem{Item: item, Exist: ok}
	}
	m.logger.Error("can't next", errors.New("iterator don't found"), logger.NewLoggerPair("name", name))
	return plugin.IteratorItem{Item: "", Exist: false}
}

func (m *Manager) Reset(name string) {
	if it, ok := m.iterators[name]; ok {
		it.Reset()
		return
	}
	m.logger.Error("can't reset", errors.New("iterator don't found"), logger.NewLoggerPair("name", name))
}

func (m *Manager) DeleteReports(name string) {
	delete(m.iterators, name)
}
