package domain

import "github.com/gookit/event"

type EventType string

func (et EventType) ToString() string {
	return string(et)
}

const (
	TableDataEditEvent   EventType = "table.data.edit"
	TableDataImportEvent EventType = "table.data.import"
	TableDeleteEvent     EventType = "table.delete"
	QuerySetUpdateEvent  EventType = "table.query.set.update"
)

type EventTable struct {
	Context  *Context
	Type     EventType
	Table    *Table
	QuerySet *QuerySet
}

func NewEventTable(ctx *Context, t EventType) *EventTable {
	return &EventTable{
		Context: ctx,
		Type:    t,
	}
}
func (et *EventTable) WithContext(t *Context) *EventTable {
	et.Context = t
	return et
}
func (et *EventTable) WithType(t EventType) *EventTable {
	et.Type = t
	return et
}

func (et *EventTable) WithTable(t *Table) *EventTable {
	et.Table = t
	return et
}

func (et *EventTable) WithQuerySet(t *QuerySet) *EventTable {
	et.QuerySet = t
	return et
}

func (et *EventTable) ResolveEvent(e event.Event) {
	et.Context = e.Get("Context").(*Context)
	et.Type = e.Get("Type").(EventType)
	et.Table = e.Get("Table").(*Table)
	et.QuerySet = e.Get("QuerySet").(*QuerySet)
}

func (et *EventTable) FireEvent() event.Event {
	e := event.M{}
	e["Context"] = et.Context
	e["Type"] = et.Type
	e["Table"] = et.Table
	e["QuerySet"] = et.QuerySet
	return event.MustFire(et.Type.ToString(), e)
}