package domain

import "github.com/gookit/event"

type EventType string

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

const (
	TableDataEditEvent        EventType = "table.data.edit"
	TableStructEditEvent      EventType = "table.struct.edit"
	TableDataImportEvent      EventType = "table.data.import"
	TableDeleteEvent          EventType = "table.delete"
	QuerySetUpdateEvent       EventType = "table.query.set.update"
	QuerySetUpdateRenameEvent EventType = "table.query.set.update.rename"

	TableApplyOnEvent         EventType = "table.apply-on"
	QuerySetUpdateStatusEvent EventType = "table.query.set.update.status" // 禁用启用
	QuerySetDeleteEvent       EventType = "table.query.set.delete"        // 删除
)

// EventTable 表事件
type EventTable struct {
	Context     *Context
	Type        EventType
	Table       *Table
	QuerySet    *QuerySet
	OldQuerySet *QuerySet
	OldTable    *Table
	Metadata    map[string]interface{}
}

func NewEventTable(ctx *Context, t EventType) *EventTable {
	return &EventTable{
		Context:  ctx,
		Type:     t,
		Metadata: make(map[string]interface{}),
	}
}
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) WithOldTable(t *Table) *EventTable {
	et.OldTable = t
	return et
}

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

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

func (et *EventTable) WithMetadata(key string, values interface{}) *EventTable {
	et.Metadata[key] = values
	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)
	et.OldQuerySet = e.Get("OldQuerySet").(*QuerySet)
	et.OldTable = e.Get("OldTable").(*Table)
	et.Metadata = e.Get("Metadata").(map[string]interface{})
}

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