package scraper

import (
	"fmt"
	"sync"
)

// Registry manages available scrapers
type Registry struct {
	mu       sync.RWMutex
	scrapers map[string]Scraper
}

// NewRegistry creates a new scraper registry
func NewRegistry() *Registry {
	return &Registry{
		scrapers: make(map[string]Scraper),
	}
}

// Register adds a scraper to the registry
func (r *Registry) Register(s Scraper) error {
	r.mu.Lock()
	defer r.mu.Unlock()

	name := s.Name()
	if _, exists := r.scrapers[name]; exists {
		return fmt.Errorf("scraper %q already registered", name)
	}

	r.scrapers[name] = s
	return nil
}

// Get retrieves a scraper by name
func (r *Registry) Get(name string) (Scraper, error) {
	r.mu.RLock()
	defer r.mu.RUnlock()

	s, ok := r.scrapers[name]
	if !ok {
		return nil, fmt.Errorf("scraper %q not found", name)
	}

	return s, nil
}

// List returns all registered scraper names
func (r *Registry) List() []string {
	r.mu.RLock()
	defer r.mu.RUnlock()

	names := make([]string, 0, len(r.scrapers))
	for name := range r.scrapers {
		names = append(names, name)
	}

	return names
}
