package impl

import (
	"fmt"

	"github.com/pingcap/dbaas/billing2/billing_errors"
	"github.com/pingcap/dbaas/billing2/db/entity"
	"github.com/pingcap/dbaas/billing2/handler/paymenthandler"
)

type PaymentHandlerImpl struct {
}

func (*PaymentHandlerImpl) GetProvider(provider string) (paymenthandler.PaymentProvider, error) {
	switch provider {
	case entity.PaymentType_AWS:
		return &AwsPaymentHandlerImpl{}, nil
	case entity.PaymentType_GCP:
		return &GcpPaymentHandlerImpl{}, nil
	case entity.PaymentType_STRIPE:
		return &paymenthandler.StripePaymentHandlerImpl{}, nil
	case entity.PaymentType_WireTransfer:
		return &WireTransferHandlerImpl{}, nil
	case entity.PaymentType_MSP:
		return &MspHandlerImpl{}, nil
	case entity.PaymentType_AWSCPPOTransfer:
		return &AWSCPPOCustomerInvoiceTransferHandlerImpl{}, nil
	case entity.PaymentType_AWSCPPOReseller:
		return &AWSCPPOResellerHandlerImpl{}, nil
	case entity.PaymentType_GCPMCPOTransfer:
		return &GCPMCPOCustomerInvoiceTransferHandlerImpl{}, nil
	case entity.PaymentType_GCPMCPOReseller:
		return &GCPMCPOResellerHandlerImpl{}, nil
	case entity.PaymentType_AliCloud:
		return &AliCloudPaymentHandlerImpl{}, nil
	case entity.PaymentType_AZURE:
		return &AzurePaymentHandlerImpl{}, nil
	case entity.PaymentType_Resale:
		return &ResaleHandlerImpl{}, nil
	default:
		return nil, billing_errors.NewInvalidInputError(fmt.Errorf("invalid payment handler:%s", provider))
	}
}

func (*PaymentHandlerImpl) AllProviders() []string {
	return []string{
		entity.PaymentType_STRIPE,
		entity.PaymentType_AWS,
		entity.PaymentType_GCP,
		entity.PaymentType_WireTransfer,
		entity.PaymentType_MSP,
		entity.PaymentType_AWSCPPOTransfer,
		entity.PaymentType_AWSCPPOReseller,
		entity.PaymentType_GCPMCPOTransfer,
		entity.PaymentType_GCPMCPOReseller,
		entity.PaymentType_AliCloud,
		entity.PaymentType_AZURE,
	}
}
