package scenario_archive

import (
	"context"

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

// Имя файла с описанием сценария внутри архива.
const FileName = "scenario.json"

// Текущая версия формата scenario.json.
const Version = 1

// ScenarioJSON — описание сценария в архиве; Story — в формате колонки
// scenarios.scenario в БД.
type ScenarioJSON struct {
	Version     int                 `json:"version"`
	Name        string              `json:"name"`
	Description string              `json:"description,omitempty"`
	Image       string              `json:"image,omitempty"`
	Story       *storytelling.Story `json:"story"`
}

// Bundle — результат разбора входящего архива.
type Bundle struct {
	Scenario *ScenarioJSON
	Files    map[string][]byte
}

// IScenarioArchive — контракт модуля scenario_archive: сборка и разбор
// ZIP-архива сценария.
type IScenarioArchive interface {
	// Pack собирает ZIP-архив сценария: ссылки на изображения хранилища
	// переписываются в images/<имя>, файлы запрашиваются через getFile;
	// внешние URL остаются без изменений.
	Pack(
		ctx context.Context,
		scenario *repos.Scenario,
		domain string,
		getFile func(ctx context.Context, name string) ([]byte, error),
	) ([]byte, error)

	// Unpack разбирает входящий архив с проверкой лимитов и путей записей.
	Unpack(data []byte) (*Bundle, error)
}
