package pocketbase

import (
	"fmt"

	"github.com/pocketbase/pocketbase/core"

	"git.vakhrushev.me/av/transcriber/internal/adapter/repo/pocketbase/migrations"
	"git.vakhrushev.me/av/transcriber/internal/entity"
)

type RecordEventRepository struct {
	app core.App
}

func NewRecordEventRepository(app core.App) *RecordEventRepository {
	return &RecordEventRepository{app: app}
}

// Append пишет строку журнала событий записи.
//
// Журнал пишется на смену рубежа, на остановку и на снятие остановки, а не на
// каждое откладывание опроса: часовая запись дала бы сотни строк ни о чём. Ни
// один шаг конвейера его не читает, чтобы решить, что делать дальше: решение
// принимается по рубежу записи, и второй источник решения разошёлся бы с первым
// молча.
//
// Содержимое записи сюда не попадает — инвариант приватности действует здесь
// наравне с журналом сервиса.
func (repo *RecordEventRepository) Append(event *entity.RecordEvent) error {
	collection, err := findCollection(repo.app, migrations.RecordEventsCollection)
	if err != nil {
		return err
	}

	record := core.NewRecord(collection)
	record.Set("record", event.RecordID)
	record.Set("origin", event.Origin)
	record.Set("step", event.Step)
	record.Set("outcome", event.Outcome)
	record.Set("outcome_text", event.OutcomeText)
	record.Set("duration_ms", event.DurationMs)

	if err := repo.app.Save(record); err != nil {
		return fmt.Errorf("failed to append event of record %s: %w", event.RecordID, err)
	}

	event.Id = record.Id
	return nil
}
