package recognize

import "testing"

func TestSeasonSummary(t *testing.T) {
	// ep — эпизодный файл с заданным (или nil) сезоном.
	ep := func(season *int) PlanFile {
		return PlanFile{Role: RoleEpisode, Season: season}
	}
	n := func(v int) *int { return &v }

	cases := []struct {
		name  string
		files []PlanFile
		want  string
	}{
		{"пусто", nil, ""},
		{"один сезон", []PlanFile{ep(n(2)), ep(n(2))}, "Сезон 2"},
		{"диапазон", []PlanFile{ep(n(1)), ep(n(2)), ep(n(3))}, "Сезоны 1–3"},
		{"разрыв", []PlanFile{ep(n(1)), ep(n(3)), ep(n(4))}, "Сезоны 1, 3–4"},
		{"несортированный вход", []PlanFile{ep(n(3)), ep(n(1)), ep(n(2))}, "Сезоны 1–3"},
		{"только спецвыпуски (nil)", []PlanFile{ep(nil)}, "Спецвыпуски"},
		{"только спецвыпуски (0)", []PlanFile{ep(n(0))}, "Спецвыпуски"},
		{"сезоны и спецвыпуски", []PlanFile{ep(n(1)), ep(n(2)), ep(nil)}, "Сезоны 1–2, спецвыпуски"},
		{"один сезон и спецвыпуски", []PlanFile{ep(n(1)), ep(nil)}, "Сезон 1, спецвыпуски"},
	}
	for _, c := range cases {
		t.Run(c.name, func(t *testing.T) {
			got := SeasonSummary(Plan{Files: c.files})
			if got != c.want {
				t.Errorf("SeasonSummary = %q, want %q", got, c.want)
			}
		})
	}
}

// Не-эпизодные файлы (main/subtitle/…) не влияют на сводку сезонов.
func TestSeasonSummary_IgnoresNonEpisodes(t *testing.T) {
	s := 2
	plan := Plan{Files: []PlanFile{
		{Role: RoleEpisode, Season: &s},
		{Role: RoleMain},
		{Role: RoleSubtitle},
		{Role: RoleIgnore},
	}}
	if got := SeasonSummary(plan); got != "Сезон 2" {
		t.Errorf("SeasonSummary = %q, want «Сезон 2»", got)
	}
}
