package server

import (
	"context"
	"strings"
	"time"

	"git.mchus.pro/mchus/logpile/internal/collector"
	"git.mchus.pro/mchus/logpile/internal/models"
)

type mockConnector struct {
	protocol string
}

func (c *mockConnector) Protocol() string {
	return c.protocol
}

func (c *mockConnector) Collect(ctx context.Context, req collector.Request, emit collector.ProgressFn) (*models.AnalysisResult, error) {
	steps := []collector.Progress{
		{Status: CollectStatusRunning, Progress: 20, Message: "Подключение..."},
		{Status: CollectStatusRunning, Progress: 50, Message: "Сбор инвентаря..."},
		{Status: CollectStatusRunning, Progress: 80, Message: "Нормализация..."},
	}
	for _, step := range steps {
		if !collectorSleep(ctx, 100*time.Millisecond) {
			return nil, ctx.Err()
		}
		if emit != nil {
			emit(step)
		}
	}

	if strings.Contains(strings.ToLower(req.Host), "fail") {
		return nil, context.DeadlineExceeded
	}

	return &models.AnalysisResult{
		Events:   make([]models.Event, 0),
		FRU:      make([]models.FRUInfo, 0),
		Sensors:  make([]models.SensorReading, 0),
		Hardware: &models.HardwareConfig{},
	}, nil
}

func testCollectorRegistry() *collector.Registry {
	r := collector.NewRegistry()
	r.Register(&mockConnector{protocol: "redfish"})
	r.Register(&mockConnector{protocol: "ipmi"})
	return r
}

func collectorSleep(ctx context.Context, d time.Duration) bool {
	timer := time.NewTimer(d)
	defer timer.Stop()
	select {
	case <-ctx.Done():
		return false
	case <-timer.C:
		return true
	}
}
