package paymenthandler

import (
	"fmt"

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

type PaymentProvider interface {
	GetUserCode(tenant forms.Tenant) (string, error)
	Pay(userCode string, invoice *forms.Invoice) error
	Payable(userCode string) (bool, error)
}

type PaymentHandler interface {
	GetProvider(provider string) (PaymentProvider, error)
}

var globalHandler PaymentHandler = &PaymentHandlerImpl{}

func GetPaymentHandler() PaymentHandler {
	return globalHandler
}

func SetPaymentHandler(handler PaymentHandler) {
	globalHandler = handler
}

type PaymentHandlerImpl struct {
}

func (*PaymentHandlerImpl) GetProvider(provider string) (PaymentProvider, error) {
	if provider == entity.PaymentType_AWS {
		return &AwsPaymentHandlerImpl{}, nil
	}
	if provider == entity.PaymentType_GCP {
		return &GcpPaymentHandlerImpl{}, nil
	}
	if provider == entity.PaymentType_STRIPE {
		return &StripePaymentHandlerImpl{}, nil
	}

	return nil, billing_errors.NewInvalidInputError(fmt.Errorf("invalid payment handler:%s", provider))
}
