package worker

import (
	"context"
	"testing"

	"git.vakhrushev.me/av/jellybit/internal/qbt"
	"git.vakhrushev.me/av/jellybit/internal/store"
)

// TestPollBuildsLiveSnapshot: после Poll снимок несёт телеметрию качающейся и
// сидирующей задач (с верным Seeding), доступную по любому из infohash;
// неизвестный/пустой infohash → ok=false.
func TestPollBuildsLiveSnapshot(t *testing.T) {
	qb := &fakeQbt{torrents: []qbt.Torrent{
		// Качается (Category пуст → discover не усыновляет, store не мешает).
		{Hash: "aaa", State: "downloading", Progress: 0.5, Dlspeed: 1000, Eta: 120, TotalSize: 4096},
		// Сидирует, гибридный торрент: t.Hash дублирует v1 (как отдаёт qBittorrent),
		// индексируем по infohash_v1/v2 (усечённый t.Hash не индексируем — NIT-11).
		{
			Hash: "bbb1", InfohashV1: "bbb1", InfohashV2: "BBB2",
			State: "uploading", Progress: 1.0, TotalSize: 8192,
			Ratio: 2.5, NumSeeds: 3, NumLeechs: 1, Uploaded: 999, Upspeed: 50,
		},
	}}
	w := newTestWorker(&fakeStore{downloads: map[string]*store.Download{}}, qb)

	if err := w.Poll(context.Background()); err != nil {
		t.Fatalf("Poll: %v", err)
	}

	dl, ok := w.Live("aaa")
	if !ok {
		t.Fatal("нет телеметрии качающейся задачи")
	}
	if dl.Seeding {
		t.Error("качающаяся задача помечена Seeding")
	}
	if dl.Progress != 0.5 || dl.DlSpeed != 1000 || dl.ETA != 120 {
		t.Errorf("телеметрия качания неверна: %+v", dl)
	}
	if dl.TotalSize != 4096 {
		t.Errorf("полный размер качающейся задачи: got %d, want 4096", dl.TotalSize)
	}

	// Сидирующая задача находится по любому из своих infohash (lowercase).
	for _, h := range []string{"bbb1", "BBB2", "bbb2"} {
		sd, ok := w.Live(h)
		if !ok {
			t.Fatalf("нет телеметрии раздачи по ключу %q", h)
		}
		if !sd.Seeding {
			t.Errorf("ключ %q: Seeding=false для uploading", h)
		}
		if sd.Ratio != 2.5 || sd.Seeds != 3 || sd.Peers != 1 || sd.Uploaded != 999 || sd.UpSpeed != 50 {
			t.Errorf("ключ %q: статистика раздачи неверна: %+v", h, sd)
		}
		if sd.TotalSize != 8192 {
			t.Errorf("ключ %q: полный размер раздачи: got %d, want 8192", h, sd.TotalSize)
		}
	}

	if _, ok := w.Live("unknownhash"); ok {
		t.Error("неизвестный infohash вернул ok=true")
	}
	if _, ok := w.Live(""); ok {
		t.Error("пустой infohash вернул ok=true")
	}
}
