package nextgenmetering

import "github.com/tidbcloud/metering/pkg/common/models"

type PremiumResourceManagerHandler struct {
	gen *SKUGenerator
}

func NewPremiumResourceManagerHandler(gen *SKUGenerator) *PremiumResourceManagerHandler {
	return &PremiumResourceManagerHandler{gen: gen}
}

func (h *PremiumResourceManagerHandler) GenerateSKUs(dataPoint map[string]interface{}, params *GenerateSKUParams) ([]models.BillingReportV2Deltalake, error) {
	return h.gen.GenerateResourceManagerSKUs(
		dataPoint, params.ClusterID, params.SharedPoolID, params.TenantID, params.Timestamp,
		params.CloudProvider, params.Region, params.Plan,
		params.EnrichmentData, params.BackupMetaData, params.Now,
	)
}

type PremiumProxyHandler struct {
	gen *SKUGenerator
}

func NewPremiumProxyHandler(gen *SKUGenerator) *PremiumProxyHandler {
	return &PremiumProxyHandler{gen: gen}
}

func (h *PremiumProxyHandler) GenerateSKUs(dataPoint map[string]interface{}, params *GenerateSKUParams) ([]models.BillingReportV2Deltalake, error) {
	return h.gen.GenerateProxySKUs(
		dataPoint, params.ClusterID, params.SharedPoolID, params.TenantID, params.Timestamp,
		params.CloudProvider, params.Region, params.Plan,
		params.EnrichmentData, params.Now,
	)
}

type PremiumDXFHandler struct {
	gen *SKUGenerator
}

func NewPremiumDXFHandler(gen *SKUGenerator) *PremiumDXFHandler {
	return &PremiumDXFHandler{gen: gen}
}

func (h *PremiumDXFHandler) GenerateSKUs(dataPoint map[string]interface{}, params *GenerateSKUParams) ([]models.BillingReportV2Deltalake, error) {
	return h.gen.GenerateDXFSKUs(
		dataPoint, params.ClusterID, params.SharedPoolID, params.TenantID, params.Timestamp,
		params.CloudProvider, params.Region, params.Plan,
		params.EnrichmentData, params.Now,
	)
}

type PremiumStorageSizeHandler struct {
	gen *SKUGenerator
}

func NewPremiumStorageSizeHandler(gen *SKUGenerator) *PremiumStorageSizeHandler {
	return &PremiumStorageSizeHandler{gen: gen}
}

func (h *PremiumStorageSizeHandler) GenerateSKUs(dataPoint map[string]interface{}, params *GenerateSKUParams) ([]models.BillingReportV2Deltalake, error) {
	return h.gen.GenerateStorageSizeSKUs(
		dataPoint, params.ClusterID, params.SharedPoolID, params.TenantID, params.Timestamp,
		params.CloudProvider, params.Region, params.Plan,
		params.EnrichmentData, params.Now,
	)
}

type PremiumControlPlaneHandler struct {
	gen *SKUGenerator
}

func NewPremiumControlPlaneHandler(gen *SKUGenerator) *PremiumControlPlaneHandler {
	return &PremiumControlPlaneHandler{gen: gen}
}

func (h *PremiumControlPlaneHandler) GenerateSKUs(dataPoint map[string]interface{}, params *GenerateSKUParams) ([]models.BillingReportV2Deltalake, error) {
	return h.gen.GenerateControlPlaneDiskSKUs(
		dataPoint, params.ClusterID, params.SharedPoolID, params.TenantID, params.Timestamp,
		params.CloudProvider, params.Region, params.Plan,
		params.EnrichmentData, params.Now,
	)
}

type PremiumDFSStatsHandler struct {
	gen *SKUGenerator
}

func NewPremiumDFSStatsHandler(gen *SKUGenerator) *PremiumDFSStatsHandler {
	return &PremiumDFSStatsHandler{gen: gen}
}

func (h *PremiumDFSStatsHandler) GenerateSKUs(dataPoint map[string]interface{}, params *GenerateSKUParams) ([]models.BillingReportV2Deltalake, error) {
	return h.gen.GenerateBackupStorageSKUs(
		dataPoint, params.ClusterID, params.SharedPoolID, params.TenantID, params.Timestamp,
		params.CloudProvider, params.Region, params.Plan,
		params.EnrichmentData, params.Now,
	)
}

type PremiumManualBackupHandler struct {
	gen *SKUGenerator
}

func NewPremiumManualBackupHandler(gen *SKUGenerator) *PremiumManualBackupHandler {
	return &PremiumManualBackupHandler{gen: gen}
}

func (h *PremiumManualBackupHandler) GenerateSKUs(dataPoint map[string]interface{}, params *GenerateSKUParams) ([]models.BillingReportV2Deltalake, error) {
	return h.gen.GenerateManualBackupStorageSKUs(
		dataPoint, params.ClusterID, params.SharedPoolID, params.TenantID, params.Timestamp,
		params.CloudProvider, params.Region, params.Plan,
		params.EnrichmentData, params.Now,
	)
}

type PremiumFlexBackupHandler struct {
	gen *SKUGenerator
}

func NewPremiumFlexBackupHandler(gen *SKUGenerator) *PremiumFlexBackupHandler {
	return &PremiumFlexBackupHandler{gen: gen}
}

func (h *PremiumFlexBackupHandler) GenerateSKUs(dataPoint map[string]interface{}, params *GenerateSKUParams) ([]models.BillingReportV2Deltalake, error) {
	return h.gen.GenerateFlexBackupStorageSKUs(
		dataPoint, params.ClusterID, params.SharedPoolID, params.TenantID, params.Timestamp,
		params.CloudProvider, params.Region, params.Plan,
		params.EnrichmentData, params.Now,
	)
}

type PremiumWorkerNodeHandler struct {
	gen *SKUGenerator
}

func NewPremiumWorkerNodeHandler(gen *SKUGenerator) *PremiumWorkerNodeHandler {
	return &PremiumWorkerNodeHandler{gen: gen}
}

func (h *PremiumWorkerNodeHandler) GenerateSKUs(dataPoint map[string]interface{}, params *GenerateSKUParams) ([]models.BillingReportV2Deltalake, error) {
	return h.gen.GenerateVCPUUsageSKUs(
		dataPoint, params.ClusterID, params.SharedPoolID, params.TenantID, params.Timestamp,
		params.CloudProvider, params.Region, params.Plan,
		params.EnrichmentData, params.Now,
	)
}

type BYOCWorkerNodeHandler struct {
	gen *SKUGenerator
}

func NewBYOCWorkerNodeHandler(gen *SKUGenerator) *BYOCWorkerNodeHandler {
	return &BYOCWorkerNodeHandler{gen: gen}
}

func (h *BYOCWorkerNodeHandler) GenerateSKUs(dataPoint map[string]interface{}, params *GenerateSKUParams) ([]models.BillingReportV2Deltalake, error) {
	return h.gen.GenerateVCPUUsageSKUs(
		dataPoint, params.ClusterID, params.SharedPoolID, params.TenantID, params.Timestamp,
		params.CloudProvider, params.Region, params.Plan,
		params.EnrichmentData, params.Now,
	)
}
