package main

import (
	"encoding/json"
	"fmt"
	"sync/atomic"
)

var queueEntryIDCounter atomic.Uint32

// NewQueueEntryID returns a unique document id.
func NewQueueEntryID() QueueEntryID {
	return QueueEntryID(queueEntryIDCounter.Add(1))
}

type QueueEntryID int

// QueueEntry can contain a single or multiple scanned pages.
type QueueEntry struct {
	ID   QueueEntryID `json:"id"`
	Name string       `json:"name"`

	QueueEntryData
}

func (q QueueEntry) MarshalJSON() ([]byte, error) {
	if q.QueueEntryData == nil {
		return nil, fmt.Errorf("queue entry doesn't contain any data")
	}

	type embedded QueueEntry // Prevent recursion.
	return json.Marshal(
		struct {
			embedded
			Type string `json:"type"`
		}{
			embedded: embedded(q),
			Type:     q.QueueEntryDataType(),
		},
	)
}