package game_service

import (
	"strings"

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

// mapApplications — улики команды для ответа организатору (GetFullGame):
// имена файлов префиксуются доменом идемпотентно, file_type деривируется
// из расширения при пустом значении (легаси-строки таблицы).
func mapApplications(o []*repos.Application, domain string) []*storytelling.Application {
	res := make([]*storytelling.Application, 0, len(o))
	for _, item := range o {
		res = append(res, mapApplication(item, domain))
	}
	return res
}

func mapApplication(o *repos.Application, domain string) *storytelling.Application {
	image := prefixDomain(o.Image, domain)
	app := &storytelling.Application{
		Name:  o.Name,
		Image: image,
	}
	app.FileType = o.FileType
	if app.FileType == "" {
		app.FileType = file_storage.FileType(image)
	}
	return app
}

// newApplication — улика для сохранения команде (AddTeamAction): имена
// приходят из истории уже с доменным префиксом (mapStory), в БД хранятся
// относительные пути — префикс снимается идемпотентно; file_type
// деривируется при пустом значении. Name не меняется (очистка — в
// вызывающем коде, cleaner'ом).
func newApplication(app *storytelling.Application, domain string) *repos.Application {
	image := strings.TrimPrefix(app.Image, domain)
	fileType := app.FileType
	if fileType == "" {
		fileType = file_storage.FileType(image)
	}
	return &repos.Application{
		Name:     app.Name,
		Image:    image,
		FileType: fileType,
	}
}

// prefixDomain — идемпотентная префиксация ссылки доменом хранилища
// (пустые ссылки и внешние http/https URL не трогаются).
func prefixDomain(ref, domain string) string {
	if ref == "" || strings.HasPrefix(ref, domain) {
		return ref
	}
	low := strings.ToLower(ref)
	if strings.HasPrefix(low, "http://") || strings.HasPrefix(low, "https://") {
		return ref
	}
	return domain + ref
}
