package models

import (
	"time"

	"gorm.io/gorm"
)

// A note describes some user generated text content.
type Note struct {
	ID        string    `gorm:"primarykey;type:uuid;default:gen_random_uuid()"` // Make ID a string (uuid) for other implementations
	CreatedAt time.Time // When this entry was created
	UpdatedAt time.Time // When this entry was last updated
	// When this entry was deleted (for soft deletions)
	// Soft delete means that this entry still exists in the db, but gorm won't include it anymore unless specifically told to
	// If not null, this entry is marked as deleted
	DeletedAt gorm.DeletedAt `gorm:"index"`
	Creator   User           // The user that created this note
	CreatorId string         // Id of the creator user
	Remote    bool           // Whether the note is originally a remote one and just "cached"
	// Raw content of the note. So without additional formatting applied
	// Might already have formatting applied beforehand from the origin server
	RawContent     string
	ContentWarning *string         // Content warnings of the note, if it contains any
	RepliesTo      *string         // Url of the message this replies to
	Quotes         *string         // url of the message this note quotes
	AccessLevel    NoteAccessLevel // Where to send this message to (public, home, followers, dm)
	OriginServer   string          // Url of the origin server. Also the primary key for those

	AttachmentRelations []NoteToAttachment `gorm:"foreignKey:NoteId"` // Attachments added on to this note
	EmoteRelations      []NoteToEmote      `gorm:"foreignKey:NoteId"` // Emotes used in this note
	PingRelations       []NoteToPing       `gorm:"foreignKey:NoteId"` // Pings/mentions this note performs
	Tags                []NoteTag          `gorm:"foreignKey:NoteId"` // Tags this note contains
}
