package orm

// Command represents an ORM write command for One2many/Many2many fields.
// Mirrors: odoo/orm/fields.py Command class
//
// Odoo uses a tuple-based command system:
//
//	(0, 0, {values})      → CREATE: create new record
//	(1, id, {values})     → UPDATE: update existing record
//	(2, id, 0)            → DELETE: delete record
//	(3, id, 0)            → UNLINK: remove link (M2M only)
//	(4, id, 0)            → LINK: add link (M2M only)
//	(5, 0, 0)             → CLEAR: remove all links (M2M only)
//	(6, 0, [ids])         → SET: replace all links (M2M only)
type Command struct {
	Operation CommandOp
	ID        int64
	Values    Values
	IDs       []int64 // For SET command
}

// CommandOp is the command operation type.
type CommandOp int

const (
	CommandCreate CommandOp = 0
	CommandUpdate CommandOp = 1
	CommandDelete CommandOp = 2
	CommandUnlink CommandOp = 3
	CommandLink   CommandOp = 4
	CommandClear  CommandOp = 5
	CommandSet    CommandOp = 6
)

// CmdCreate returns a CREATE command. Mirrors: Command.create(values)
func CmdCreate(values Values) Command {
	return Command{Operation: CommandCreate, Values: values}
}

// CmdUpdate returns an UPDATE command. Mirrors: Command.update(id, values)
func CmdUpdate(id int64, values Values) Command {
	return Command{Operation: CommandUpdate, ID: id, Values: values}
}

// CmdDelete returns a DELETE command. Mirrors: Command.delete(id)
func CmdDelete(id int64) Command {
	return Command{Operation: CommandDelete, ID: id}
}

// CmdUnlink returns an UNLINK command. Mirrors: Command.unlink(id)
func CmdUnlink(id int64) Command {
	return Command{Operation: CommandUnlink, ID: id}
}

// CmdLink returns a LINK command. Mirrors: Command.link(id)
func CmdLink(id int64) Command {
	return Command{Operation: CommandLink, ID: id}
}

// CmdClear returns a CLEAR command. Mirrors: Command.clear()
func CmdClear() Command {
	return Command{Operation: CommandClear}
}

// CmdSet returns a SET command. Mirrors: Command.set(ids)
func CmdSet(ids []int64) Command {
	return Command{Operation: CommandSet, IDs: ids}
}
