package api

import (
	"errors"

	"github.com/gin-gonic/gin"
	"github.com/pingcap/dbaas/billing2/billing_errors"
	"github.com/pingcap/dbaas/billing2/forms"
	"github.com/pingcap/dbaas/billing2/model/payment/paymentsub"
	"github.com/pingcap/dbaas/billing2/utils/ginutils"
)

var paymentModel = paymentsub.PaymentModel{}

// @Summary Create PaymentMethod
// @Schemes
// @Accept json
// @Produce json
// @Param tenant_id path string true "tenant_id"
// @Param PaymentMethod body forms.PaymentMethodInput true "PaymentMethod"
// @Success 200 {object} forms.PaymentMethod
// @Router /tenants/{tenant_id}/payments [post]
func (s *API) CreatePayment(c *gin.Context) (ginutils.HandlerFuncResult, error) {
	tenantID, err := getTenantIDFromURI(c)
	if err != nil {
		return nil, err
	}
	paymentMethod := &forms.PaymentMethod{}
	err = c.ShouldBindJSON(&paymentMethod)
	if err != nil {
		return nil, billing_errors.NewInvalidInputError(err)
	}

	info, err := paymentModel.CreatePaymentMethod(tenantID, paymentMethod)
	if err != nil {
		return nil, err
	}
	return info, nil
}

// @Summary List PaymentMethod
// @Schemes
// @Accept json
// @Produce json
// @Param tenant_id path string true "tenant_id"
// @Success 200 {object} []forms.PaymentMethod
// @Router /tenants/{tenant_id}/payments [get]
func (s *API) ListPayments(c *gin.Context) (ginutils.HandlerFuncResult, error) {
	tenantID, err := getTenantIDFromURI(c)
	if err != nil {
		return nil, err
	}
	info, err := paymentModel.GetPaymentMethod(tenantID)
	if err != nil {
		if errors.Is(err, billing_errors.ObjectNotExistsError) {
			return []forms.PaymentMethod{}, nil
		}
		return nil, err
	}
	return []forms.PaymentMethod{
		*info,
	}, nil
}

func InitializePaymentRouter(router ginutils.MyRoute) {
	s := &API{}
	router.HandleWithError("POST", "/tenants/:tenant_id/payments", s.CreatePayment)
	router.HandleWithError("GET", "/tenants/:tenant_id/payments", s.ListPayments)

	InitializeStripePaymentRouter(router)
}
