package game_service

import (
	"testing"

	"evening_detective_server/internal/modules/storytelling"
	"evening_detective_server/internal/repos"
)

const testDomain = "http://storage.test/api/files/"

func TestNewApplication(t *testing.T) {
	cases := []struct {
		name  string
		app   *storytelling.Application
		image string // ожидаемое хранимое имя (без домена)
		ftype string // ожидаемый file_type
	}{
		{
			name: "доменный префикс снимается, file_type сохраняется",
			app: &storytelling.Application{
				Name:     "Улика",
				Image:    testDomain + "clue.pdf",
				FileType: "pdf",
			},
			image: "clue.pdf",
			ftype: "pdf",
		},
		{
			name: "относительное имя не трогается",
			app: &storytelling.Application{
				Name:     "Улика",
				Image:    "clue.png",
				FileType: "image",
			},
			image: "clue.png",
			ftype: "image",
		},
		{
			name: "пустой file_type деривируется из расширения",
			app: &storytelling.Application{
				Name:  "Улика",
				Image: testDomain + "clue.ogg",
			},
			image: "clue.ogg",
			ftype: "audio",
		},
		{
			name: "внешний URL снимается как префикс только при совпадении домена",
			app: &storytelling.Application{
				Name:  "Улика",
				Image: "https://example.com/clue.pdf",
			},
			image: "https://example.com/clue.pdf",
			ftype: "pdf",
		},
	}
	for _, c := range cases {
		got := newApplication(c.app, testDomain)
		if got.Name != c.app.Name {
			t.Errorf("%s: Name = %q, want %q", c.name, got.Name, c.app.Name)
		}
		if got.Image != c.image {
			t.Errorf("%s: Image = %q, want %q", c.name, got.Image, c.image)
		}
		if got.FileType != c.ftype {
			t.Errorf("%s: FileType = %q, want %q", c.name, got.FileType, c.ftype)
		}
	}
}

func TestMapApplications(t *testing.T) {
	o := []*repos.Application{
		{Name: "Улика", Image: "clue.pdf", FileType: ""},
		{Name: "Фото", Image: "https://external.example.com/pic.jpg", FileType: "image"},
	}

	got := mapApplications(o, testDomain)
	if len(got) != 2 {
		t.Fatalf("len = %d, want 2", len(got))
	}

	// Относительное имя префиксуется доменом, file_type деривируется.
	if got[0].Image != testDomain+"clue.pdf" {
		t.Errorf("Image[0] = %q, want %q", got[0].Image, testDomain+"clue.pdf")
	}
	if got[0].FileType != "pdf" {
		t.Errorf("FileType[0] = %q, want pdf", got[0].FileType)
	}

	// Внешний URL не префиксуется повторно.
	if got[1].Image != "https://external.example.com/pic.jpg" {
		t.Errorf("Image[1] = %q, want внешний URL без изменений", got[1].Image)
	}
	if got[1].FileType != "image" {
		t.Errorf("FileType[1] = %q, want image", got[1].FileType)
	}
}

func TestPrefixDomain(t *testing.T) {
	cases := []struct {
		ref    string
		domain string
		want   string
	}{
		{"clue.pdf", testDomain, testDomain + "clue.pdf"},
		{testDomain + "clue.pdf", testDomain, testDomain + "clue.pdf"},
		{"https://example.com/clue.pdf", testDomain, "https://example.com/clue.pdf"},
		{"http://example.com/clue.pdf", testDomain, "http://example.com/clue.pdf"},
		{"", testDomain, ""},
	}
	for _, c := range cases {
		if got := prefixDomain(c.ref, c.domain); got != c.want {
			t.Errorf("prefixDomain(%q) = %q, want %q", c.ref, got, c.want)
		}
	}
}
