// Package migrations — шаги схемы хранилища и имена коллекций, которые они
// заводят.
//
// Схема заводится версионированными шагами, и применённый шаг не переписывается
// — только новым шагом. Инвариант проекта перенесён дословно: хранилище считает
// применённое по **имени шага**, а не по пути файла, поэтому имена в
// `Register` ниже не переносятся и не переименовываются, даже если файл переехал.
//
// Шаги лежат своим каталогом, а не файлом внутри пакета репозитория, и причина
// внешняя: сверка документов ловит изменённый шаг схемы при нетронутом
// `docs/database.md` по префиксу пути (`.av-dev.toml`, ключ `migrations` секции
// `[docs]`), а префикс наводится только на каталог. Пока шаги лежали файлом,
// наводить его
// было не на что, и проверка молчала на всякой правке схемы.
package migrations

import (
	pbmigrations "github.com/pocketbase/pocketbase/migrations"
)

// Имена коллекций живут здесь, рядом с шагом, который их заводит. Они же — часть
// пути к файлу в раскладке хранилища и часть адреса ссылки на него, поэтому
// меняются только новым шагом схемы.
const (
	FilesCollection = "files"
	// JobsCollection — прежняя коллекция задач. Шаг 202608140002 её удаляет;
	// имя остаётся здесь, потому что на него ссылаются прежние шаги схемы, а
	// применённый шаг не переписывается.
	JobsCollection = "transcribe_jobs"
	// RecordsCollection — аудиозапись, центральная сущность сервиса. Имя в
	// snake_case, как у соседей по схеме: одно исключение разошлось бы молча по
	// константе имён, запросу захвата, правилам панели и запрету удаления.
	RecordsCollection      = "audio_records"
	TextsCollection        = "texts"
	StructuresCollection   = "structures"
	RecognitionsCollection = "recognitions"
	RecordEventsCollection = "record_events"
	TopicsCollection       = "topics"
	// UsersCollection заводит не наш шаг, а системный шаг библиотеки. Имя стоит
	// здесь потому, что на него ссылаются и шаги схемы, и проверка предъявителя
	// на приёме: строковый литерал в двух местах разошёлся бы молча.
	UsersCollection = "users"
)

// Шаг регистрируется в списке приложения при загрузке пакета, а накатывает его
// `apis.Serve` прежде, чем поднять сервер.
func init() {
	pbmigrations.Register(up202608110001, down202608110001, "202608110001_init.go")
	pbmigrations.Register(up202608120001, down202608120001, "202608120001_oidc_login.go")
	pbmigrations.Register(up202608140001, down202608140001, "202608140001_record_owner.go")
	pbmigrations.Register(up202608140002, down202608140002, "202608140002_record_centric_model.go")
	pbmigrations.Register(up202608140003, down202608140003, "202608140003_owner_required.go")
	pbmigrations.Register(up202608150001, down202608150001, "202608150001_record_contract_columns.go")
}

func ptr[T any](v T) *T { return &v }
