package datainit

import (
	"time"

	"github.com/pingcap/dbaas/billing2/forms"
	"github.com/pingcap/dbaas/billing2/model/billing"
	"github.com/pingcap/dbaas/billing2/model/payment"
	"github.com/pingcap/dbaas/billing2/model/payment/paymentsub"
	"github.com/pingcap/dbaas/billing2/utils/tests"
	"github.com/shopspring/decimal"
)

const TestUnit = "test_unit"

var BillingDate = time.Date(2021, 11, 1, 0, 0, 0, 0, time.UTC)

func CreatePricePackageAndBind(tenantID uint) error {
	_, err := (&billing.UnitModel{}).CreateUnit(&forms.UnitInfo{
		UnitKey: TestUnit,
	})
	if err != nil {
		return err
	}
	packageModel := &billing.PackageModel{}
	info, err := packageModel.CreatePackage(
		&forms.PackageInfo{
			UnitPrices: forms.UnitPrices{
				TestUnit: {Price: decimal.NewFromInt(1)},
			},
			Discount: decimal.NewFromInt(1),
		})
	if err != nil {
		return err
	}
	bindedModel := &billing.BindedPackageModel{}
	_, err = bindedModel.BindPackage(tenantID, info.PackageID)
	if err != nil {
		return err
	}
	return nil
}

func CreateMeasuresWithTime(tenantID uint, date time.Time) error {
	err := CreatePricePackageAndBind(tenantID)
	if err != nil {
		return err
	}

	err = CreatePaymentMock(tenantID)
	if err != nil {
		return err
	}

	measureModel := &billing.MeasureModel{}
	_, err = measureModel.CostUnits(tenantID, &forms.UnitCosts{
		CostTimeStamp: date.Unix(),
		Unit:          TestUnit,
		Cost:          1,
	})
	if err != nil {
		return err
	}
	return nil
}

func CreateMeasures(tenantID uint) error {
	return CreateMeasuresWithTime(tenantID, BillingDate)
}

func CreateInvoice(tenantID uint) (*forms.Invoice, error) {
	err := CreateMeasures(tenantID)
	if err != nil {
		return nil, err
	}
	invoiceModel := &payment.InvoiceModel{}
	info, err := invoiceModel.CreateMonthlyInvoice(tenantID, BillingDate)
	if err != nil {
		return nil, err
	}
	return info, nil
}

func CreatePaymentMock(tenantID uint) error {
	tests.MockPaymentHandler()
	tests.MockCentralHandler()
	_, err := (&paymentsub.PaymentModel{}).CreatePaymentMethod(
		tenantID,
		&forms.PaymentMethod{
			PaymentType: "mock",
		},
	)
	return err
}
