package worker

import (
	"testing"

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

func TestProviderURL(t *testing.T) {
	cases := []struct {
		name     string
		provider string
		id       string
		mtype    string
		want     string
	}{
		{"tmdb movie", "tmdb", "693134", "movie", "https://www.themoviedb.org/movie/693134"},
		{"tmdb series", "tmdb", "60622", "series", "https://www.themoviedb.org/tv/60622"},
		{"tvdb series", "tvdb", "269613", "series", "https://www.thetvdb.com/dereferrer/series/269613"},
		{"tvdb movie", "tvdb", "12345", "movie", "https://www.thetvdb.com/dereferrer/movie/12345"},
		{"imdb", "imdb", "tt0111161", "movie", "https://www.imdb.com/title/tt0111161"},
		{"unknown provider → пусто", "kinopoisk", "42", "movie", ""},
		{"пустой id → пусто", "tmdb", "", "movie", ""},
	}
	for _, c := range cases {
		t.Run(c.name, func(t *testing.T) {
			if got := ProviderURL(c.provider, c.id, c.mtype); got != c.want {
				t.Errorf("ProviderURL(%q,%q,%q) = %q, want %q", c.provider, c.id, c.mtype, got, c.want)
			}
		})
	}
}

// TestMatchURLNoLinkWhenUnbuildable — эффективный провайдер, для которого URL не
// строится и совпадающего кандидата нет, даёт пустую ссылку (транспорт покажет
// матч текстом — сценарий «URL записи неизвестен»).
func TestMatchURLNoLinkWhenUnbuildable(t *testing.T) {
	rd := &ReviewData{Provider: "kinopoisk", ProviderID: "42"}
	if got := rd.MatchURL(); got != "" {
		t.Errorf("MatchURL = %q, want пусто (URL не строится, кандидата нет)", got)
	}
}

// TestMatchURLCanonicalFromEffective — без кандидатов ссылка строится по
// эффективным provider/id и типу медиа плана.
func TestMatchURLCanonicalFromEffective(t *testing.T) {
	rd := &ReviewData{
		Provider: "tmdb", ProviderID: "60622",
		Plan: recognize.Plan{Type: recognize.MediaSeries},
	}
	if got := rd.MatchURL(); got != "https://www.themoviedb.org/tv/60622" {
		t.Errorf("MatchURL = %q, want канонический URL по типу плана", got)
	}
}

// TestMatchURLPrefersMatchingCandidate — URL берётся у выбранного кандидата,
// когда его provider+id совпадают с эффективными.
func TestMatchURLPrefersMatchingCandidate(t *testing.T) {
	rd := &ReviewData{
		Provider: "tmdb", ProviderID: "693134",
		Candidates: []store.MetadataCandidate{{
			Provider: "tmdb", ProviderID: "693134", Chosen: true,
			URL: store.NullString("https://custom.example/x"),
		}},
	}
	if got := rd.MatchURL(); got != "https://custom.example/x" {
		t.Errorf("MatchURL = %q, want URL выбранного кандидата", got)
	}
}
