package cross

import (
	"context"
	"testing"
	"time"

	"github.com/smartystreets/goconvey/convey"
	"github.com/tidbcloud/account/internel/dao/entity"
	"github.com/tidbcloud/account/internel/dao/role"
)

func ensureCreateOrg(org *entity.Tenant) *entity.Tenant {
	err := org.Create(_db)
	convey.So(err, convey.ShouldBeNil)
	return org
}

func ensureDeleteOrg(org *entity.Tenant) {
	err := org.Delete(_db)
	convey.So(err, convey.ShouldBeNil)
}

func makeTestOrgTemplate1(name string, email string) *entity.Tenant {
	org := &entity.Tenant{
		Name:                      name,
		Alias:                     name,
		Email:                     email,
		Country:                   "mars",
		TimeZone:                  "mars",
		Status:                    "active",
		POCBindedPackageID:        0,
		OnDemandBindedPackageID:   0,
		DevTierBindedPackageID:    0,
		Kind:                      "",
		AcceptService:             false,
		ZendeskID:                 0,
		ThirdPartyAccountProvider: nil,
		ThirdPartyAccountCode:     nil,
		//Quotas:                    nil,
		BillingEmail:   "",
		Projects:       nil,
		AccountManager: "",
	}
	return org
}

func TestListOrgsByUserID(t *testing.T) {
	daoCross := NewDao()
	daoRole := role.NewDao()
	ctx := context.Background()

	convey.Convey("TestListOrgsByUserID", t, func() {
		orgList := []*entity.Tenant{
			makeTestOrgTemplate1("org1", "org1"),
			makeTestOrgTemplate1("org2", "org2"),
			makeTestOrgTemplate1("org3", "org3"),
		}

		for _, org := range orgList {
			err := org.Create(_db)
			convey.So(err, convey.ShouldBeNil)
			convey.So(org.ID, convey.ShouldBeGreaterThan, 0)
		}

		now := time.Now()
		user := entity.User{
			Tenant:      orgList[0],
			FirstName:   "user1",
			LastName:    "user1",
			Email:       "user1",
			InvitedAt:   &now,
			Status:      entity.UserStatusActive,
			Job:         "",
			PhoneNumber: "",
		}
		err := user.Create(_db)
		convey.So(err, convey.ShouldBeNil)
		convey.So(user.ID, convey.ShouldBeGreaterThan, 0)

		roleList := make([]*entity.RoleBinding, 0)
		for _, org := range orgList {
			r, err := daoRole.CreateRole(
				ctx, _db,
				entity.RoleBindingTargetUser, user.ID.Uint64(),
				entity.RoleBindingScopeOrg, org.ID.Uint64(),
				entity.RoleOrgMember, entity.RoleBindingStatusActive,
			)
			convey.So(err, convey.ShouldBeNil)
			convey.So(r, convey.ShouldNotBeNil)
			convey.So(r.ID, convey.ShouldBeGreaterThan, 0)
			roleList = append(roleList, r)
		}

		convey.Convey("GetOrgsByUserID", func() {
			orgs, err := daoCross.ListOrgsByUserID(ctx, _db, user.ID.Uint64(), nil)
			convey.So(err, convey.ShouldBeNil)
			convey.So(orgs, convey.ShouldHaveLength, 3)
		})

		convey.Reset(func() {
			for _, org := range orgList {
				_ = org.Delete(_db)
			}

			_ = user.Delete(_db)
			for _, r := range roleList {
				_ = r.Delete(_db)
			}
		})
	})
}
