// Package observations handle the request of observations data from governor endpoint defined in the api.
package observations

import (
	"encoding/json"
	"strconv"
	"time"

	"github.com/wormhole-foundation/wormhole/sdk/vaa"
)

// ObservationDoc represent an observation document.
type ObservationDoc struct {
	ID           string      `bson:"_id" json:"id"`
	Version      uint8       `bson:"version" json:"version"`
	EmitterChain vaa.ChainID `bson:"emitterChain" json:"emitterChain"`
	EmitterAddr  string      `bson:"emitterAddr" json:"emitterAddr"`
	Sequence     string      `bson:"sequence" json:"sequence"`
	Hash         []byte      `bson:"hash" json:"hash"`
	TxHash       []byte      `bson:"txHash" json:"txHash"`
	GuardianAddr string      `bson:"guardianAddr" json:"guardianAddr"`
	Signature    []byte      `bson:"signature" json:"signature"`
	UpdatedAt    *time.Time  `bson:"updatedAt" json:"updatedAt"`
	IndexedAt    *time.Time  `bson:"indexedAt" json:"indexedAt"`
}

// MarshalJSON interface implementation for ObservationDoc.
func (o *ObservationDoc) MarshalJSON() ([]byte, error) {
	sequence, err := strconv.ParseUint(o.Sequence, 10, 64)
	if err != nil {
		return []byte{}, err
	}

	type Alias ObservationDoc
	return json.Marshal(&struct {
		Sequence uint64 `json:"sequence"`
		*Alias
	}{
		Sequence: sequence,
		Alias:    (*Alias)(o),
	})
}
