package accountimpl

import (
	"context"

	accountsdk "github.com/tidbcloud/account/idl/pbgen/proto/account"
	"github.com/tidbcloud/account/idl/pbgen/proto/acl"

	"github.com/tidbcloud/tidb-management-service/tidb-mgmt-portal/domain/adapter/account"
	"github.com/tidbcloud/tidb-management-service/utilities/bizerr"
)

type fakeAccountImpl struct{}

func newFakeAccountImpl() account.Client {
	return &fakeAccountImpl{}
}

func (f *fakeAccountImpl) GetOrCreateSystemUser(ctx context.Context, orgID uint64) (*accountsdk.User, bizerr.BizError) {
	return &accountsdk.User{
		Id: 10,
	}, nil
}

func (f *fakeAccountImpl) GetOpenAPIAccess(
	ctx context.Context,
	publicKey string,
) (*acl.GetOpenAPIAccessResp, bizerr.BizError) {
	return &acl.GetOpenAPIAccessResp{
		Org:      &acl.OrgAccessResp{Id: 100},
		Projects: []*acl.ProjectAccessResp{{Id: 200}, {Id: 300}},
	}, nil
}

func (f *fakeAccountImpl) GetProjectByID(ctx context.Context, id uint64) (*accountsdk.Project, bizerr.BizError) {
	return &accountsdk.Project{
		Id: id,
	}, nil
}

func (f *fakeAccountImpl) GetOrgByID(ctx context.Context, id uint64) (*accountsdk.Org, bizerr.BizError) {
	return &accountsdk.Org{
		Id: id,
	}, nil
}

func (f *fakeAccountImpl) ListOrgsByUser(ctx context.Context, userID uint64) ([]*accountsdk.Org, bizerr.BizError) {
	return []*accountsdk.Org{
		{
			Id: 100,
		},
	}, nil
}

func (f *fakeAccountImpl) ListProjectsByOrgsInUser(
	ctx context.Context,
	userID, orgID uint64,
) ([]*accountsdk.Project, bizerr.BizError) {
	return []*accountsdk.Project{
		{
			Id: 200,
		},
		{
			Id: 300,
		},
	}, nil
}

func (f *fakeAccountImpl) ListProjects(ctx context.Context, _ []uint64) ([]*accountsdk.Project, bizerr.BizError) {
	return []*accountsdk.Project{
		{
			Id: 200,
		},
		{
			Id: 300,
		},
	}, nil
}

func (f *fakeAccountImpl) GetApiKeyByAccessKey(
	ctx context.Context,
	accessKey string,
) (*accountsdk.GetApiKeyByAccessKeyRsp, bizerr.BizError) {
	return &accountsdk.GetApiKeyByAccessKeyRsp{
		ApiKey: &accountsdk.ApiKey{
			AccessKey: accessKey,
			CreatedBy: "test@pingcap.com",
		},
	}, nil
}

func (f *fakeAccountImpl) GetUserByEmail(ctx context.Context, email string) (*accountsdk.User, bizerr.BizError) {
	return &accountsdk.User{
		Id: 10,
	}, nil
}

func (f *fakeAccountImpl) GetAccountClient() accountsdk.AccountAPIServiceClient {
	return nil
}
