package exporter

import (
	"sort"

	"gorm.io/gorm"

	"github.com/break/junhong_cmp_fiber/pkg/constants"
)

// Registry 导出数据源注册中心。
type Registry struct {
	sources map[string]DataSource
}

// NewRegistry 创建导出数据源注册中心。
func NewRegistry(sources ...DataSource) *Registry {
	m := make(map[string]DataSource, len(sources))
	for _, source := range sources {
		if source == nil {
			continue
		}
		m[source.Scene()] = source
	}
	return &Registry{sources: m}
}

// NewDefaultRegistry 创建默认导出数据源注册中心。
func NewDefaultRegistry(db *gorm.DB) *Registry {
	return NewRegistry(
		NewDeviceDataSource(db),
		NewIotCardDataSource(db),
		NewOrderDataSource(db),
		NewPackageDataSource(db),
		NewAgentWalletTransactionDataSource(db),
		NewAgentRechargeDataSource(db),
		NewRefundDataSource(db),
		NewExchangeDataSource(db),
	)
}

// Get 获取指定场景数据源。
func (r *Registry) Get(scene string) (DataSource, bool) {
	source, ok := r.sources[scene]
	return source, ok
}

// IsSupported 判断场景是否支持。
func (r *Registry) IsSupported(scene string) bool {
	_, ok := r.sources[scene]
	return ok
}

// Scenes 返回当前支持的场景列表。
func (r *Registry) Scenes() []string {
	result := make([]string, 0, len(r.sources))
	for scene := range r.sources {
		result = append(result, scene)
	}
	sort.Strings(result)
	return result
}

// IsSupportedScene 判断是否为受支持的场景。
func IsSupportedScene(scene string) bool {
	switch scene {
	case constants.ExportTaskSceneDevice,
		constants.ExportTaskSceneIotCard,
		constants.ExportTaskSceneOrder,
		constants.ExportTaskScenePackage,
		constants.ExportTaskSceneAgentWalletTransaction,
		constants.ExportTaskSceneAgentRecharge,
		constants.ExportTaskSceneRefund,
		constants.ExportTaskSceneExchange:
		return true
	default:
		return false
	}
}
