package billing

import (
	"testing"

	"github.com/pingcap/errors"

	"github.com/pingcap/dbaas/billing/api/model"
	"github.com/pingcap/log"
	"github.com/stretchr/testify/assert"
	"github.com/tidbcloud/central-sdk/db/tenant"
)

func getService() Service {
	var client = &client{}
	client.baseURL = "http://127.0.0.1:8888"
	tr := &RecordParameterTransport{}
	client.transport = tr
	return client
}

type fakeServiceForSetupIntentSuccess struct {
	FakeService
}

func (f fakeServiceForSetupIntentSuccess) SetupIntent(customer string) (*model.SetupIntent, error) {
	return &model.SetupIntent{PublicKey: "public"}, nil
}

type fakeServiceForSetupIntentFail struct {
	FakeService
}

func (f fakeServiceForSetupIntentFail) SetupIntent(customer string) (*model.SetupIntent, error) {
	return nil, errors.New("fake")
}

func TestContext_SetupIntent(t *testing.T) {
	t.Skip()

	m := NewModel(log.L(), &fakeServiceForSetupIntentSuccess{})
	s, err := m.User(&tenant.User{TenantID: 1}).SetupIntent()
	assert.Nil(t, err)
	assert.Equal(t, "public", s.PublicKey)

	m = NewModel(log.L(), &fakeServiceForSetupIntentFail{})
	_, err = m.User(&tenant.User{TenantID: 1}).SetupIntent()
	assert.NotNil(t, err)

	c := m.User(&tenant.User{TenantID: 1})
	c.permissionChecker = &NoPermissionCheck{}
	_, err = c.SetupIntent()
	assert.NotNil(t, err)
}

func TestContext_ListCredits(t *testing.T) {
	t.Skip()
	m := NewModel(log.L(), getService())
	_, err := m.User(&tenant.User{TenantID: 1}).ListCredits()
	assert.Nil(t, err)
	//
	c := m.User(&tenant.User{TenantID: 1})
	c.permissionChecker = &NoPermissionCheck{}
	_, err = c.ListCredits()
	assert.NotNil(t, err)
}

func TestContext_ListPaymentMethods(t *testing.T) {
	t.Skip()
	m := NewModel(log.L(), getService())
	_, err := m.User(&tenant.User{TenantID: 1}).ListPaymentMethods(Pagination{})
	assert.Nil(t, err)

	c := m.User(&tenant.User{TenantID: 1})
	c.permissionChecker = &NoPermissionCheck{}
	_, err = c.ListPaymentMethods(Pagination{})
	assert.NotNil(t, err)
}

func TestContext_ListInvoices(t *testing.T) {
	t.Skip()
	m := NewModel(log.L(), getService())
	_, err := m.User(&tenant.User{TenantID: 1}).ListInvoices(Pagination{})
	assert.Nil(t, err)

	c := m.User(&tenant.User{TenantID: 1})
	c.permissionChecker = &NoPermissionCheck{}
	_, err = c.ListInvoices(Pagination{})
	assert.NotNil(t, err)
}

func TestContext_UpdateCustomerBillingInfo(t *testing.T) {
	t.Skip()
	m := NewModel(log.L(), getService())
	_, _, err := m.User(&tenant.User{TenantID: 1}).UpdateCustomerBillingInfo(&model.Customer{}, "cloud@pingcap.com")
	assert.Nil(t, err)

	c := m.User(&tenant.User{TenantID: 1})
	c.permissionChecker = &NoPermissionCheck{}
	_, _, err = c.UpdateCustomerBillingInfo(&model.Customer{}, "cloud@pingcap.com")
	assert.NotNil(t, err)
}

func TestContext_UpdatePaymentMethods(t *testing.T) {
	t.Skip()
	m := NewModel(log.L(), getService())
	_, err := m.User(&tenant.User{TenantID: 1}).UpdatePaymentMethods("1", &model.PaymentMethod{})
	assert.Nil(t, err)

	c := m.User(&tenant.User{TenantID: 1})
	c.permissionChecker = &NoPermissionCheck{}
	_, err = c.UpdatePaymentMethods("1", &model.PaymentMethod{})
	assert.NotNil(t, err)
}

func TestContext_DeletePaymentMethod(t *testing.T) {
	t.Skip()
	m := NewModel(log.L(), getService())
	err := m.User(&tenant.User{TenantID: 1}).DeletePaymentMethod("1")
	assert.Nil(t, err)

	c := m.User(&tenant.User{TenantID: 1})
	c.permissionChecker = &NoPermissionCheck{}
	err = c.DeletePaymentMethod("1")
	assert.NotNil(t, err)
}

func TestContext_GetCurrentBillingCycle(t *testing.T) {
	t.Skip()
	m := NewModel(log.L(), getService())
	_, err := m.User(&tenant.User{TenantID: 1}).GetCurrentBillingCycle()
	assert.Nil(t, err)

	c := m.User(&tenant.User{TenantID: 1})
	c.permissionChecker = &NoPermissionCheck{}
	_, err = c.GetCurrentBillingCycle()
	assert.NotNil(t, err)
}

func TestContext_GetCustomerBillingInfo(t *testing.T) {
	t.Skip()
	m := NewModel(log.L(), getService())
	_, _, err := m.User(&tenant.User{TenantID: 1}).GetCustomerBillingInfo()
	assert.Nil(t, err)

	c := m.User(&tenant.User{TenantID: 1})
	c.permissionChecker = &NoPermissionCheck{}
	_, _, err = c.GetCustomerBillingInfo()
	assert.NotNil(t, err)
}
