package model

import (
	"encoding/json"
	"time"
)

// Channelable defines the interface for polymorphic channel configurations.
// Each inbox has a channel_type (e.g. "Channel::WebWidget") and an associated
// channel model that implements this interface.
// Reference: P2B M2 polymorphic channel pattern
type Channelable interface {
	// GetInboxID returns the InboxID foreign key for this channel.
	GetInboxID() uint
	// GetChannelType returns the channel type string (e.g. "Channel::WebWidget").
	GetChannelType() InboxChannelType
	// TableName returns the GORM table name for this channel model.
	TableName() string
}

// ChannelRegistry maps channel type strings to their model structs.
// Used by Inbox to resolve the polymorphic Channel association.
var ChannelRegistry = map[string]func() Channelable{
	"Channel::WebWidget":  func() Channelable { return &ChannelWebWidget{} },
	"Channel::Telegram":   func() Channelable { return &ChannelTelegram{} },
	"Channel::FacebookPage": func() Channelable { return &ChannelFacebookPage{} },
	"Channel::Whatsapp":   func() Channelable { return &ChannelWhatsapp{} },
	"Channel::Email":      func() Channelable { return &ChannelEmail{} },
	"Channel::Api":        func() Channelable { return &ChannelAPI{} },
	"Channel::TwilioSms":  func() Channelable { return &ChannelTwilioSMS{} },
	"Channel::Line":       func() Channelable { return &ChannelLine{} },
	"Channel::Sms":        func() Channelable { return &ChannelSms{} },
	"Channel::Instagram":  func() Channelable { return &ChannelInstagram{} },
	"Channel::Tiktok":     func() Channelable { return &ChannelTiktok{} },
}