package cross

import (
	"context"
	"testing"

	"github.com/smartystreets/goconvey/convey"
	"github.com/tidbcloud/account/internel/dao/entity"
	"github.com/tidbcloud/account/internel/dao/user"
	"gorm.io/gorm"
)

func deleteUserByEmail(email string) {
	_db.Where("email = ?", email).Delete(&entity.User{})
}

func TestCrossDao_CreateSystemUser(t *testing.T) {
	d := NewDao()
	ctx := context.TODO()

	convey.Convey("create and load system user", t, func() {
		// create default user
		convey.Convey("load system user when it is not exist", func() {
			emptySU, err := d.Dao().User.GetSystemUserByOrgID(ctx, _db, 233)
			convey.So(emptySU, convey.ShouldBeNil)
			convey.So(err, convey.ShouldNotBeNil)
			convey.So(err, convey.ShouldEqual, gorm.ErrRecordNotFound)
		})

		convey.Convey("create system user on not existed org", func() {
			su, err := d.CreateSystemUserByOrgID(ctx, _db, 233)

			convey.So(err, convey.ShouldNotBeNil)
			convey.So(su, convey.ShouldBeNil)
		})

		org := makeTestOrgTemplate1("test", "testOrg")
		ensureCreateOrg(org)
		orgID := org.ID.Uint64()
		systemUserEmail := user.MakeSystemEmail(orgID)

		convey.Convey("create system user success", func() {
			su, err := d.CreateSystemUserByOrgID(ctx, _db, orgID)
			defer deleteUserByEmail(systemUserEmail)

			convey.So(err, convey.ShouldBeNil)
			convey.So(su, convey.ShouldNotBeNil)
			convey.So(su.ID, convey.ShouldNotBeZeroValue)

			convey.Convey("load system user via GetSystemUserByOrgID", func() {
				user, err := d.Dao().User.GetSystemUserByOrgID(ctx, _db, orgID)
				convey.So(err, convey.ShouldBeNil)
				convey.So(user.ID, convey.ShouldEqual, su.ID)
				convey.So(user.Email, convey.ShouldEqual, systemUserEmail)
			})

			convey.Convey("load system user via GetUserByEmail", func() {
				user, err := d.Dao().User.GetUserByEmail(ctx, _db, systemUserEmail)
				convey.So(err, convey.ShouldBeNil)
				convey.So(user.ID, convey.ShouldEqual, su.ID)
				convey.So(user.Email, convey.ShouldEqual, su.Email)
			})
		})

		convey.Reset(func() {
			ensureDeleteOrg(org)
		})
	})
}

func TestCrossDao_GetOrCreateSystemUser(t *testing.T) {
	d := NewDao()
	ctx := context.TODO()

	convey.Convey("create and load system user", t, func() {
		// create default user
		convey.Convey("load system user when it is not exist", func() {
			emptySU, err := d.Dao().User.GetSystemUserByOrgID(ctx, _db, 233)
			convey.So(emptySU, convey.ShouldBeNil)
			convey.So(err, convey.ShouldNotBeNil)
			convey.So(err, convey.ShouldEqual, gorm.ErrRecordNotFound)
		})

		convey.Convey("create system user on not existed org", func() {
			su, err := d.CreateSystemUserByOrgID(ctx, _db, 233)

			convey.So(err, convey.ShouldNotBeNil)
			convey.So(su, convey.ShouldBeNil)
		})

		org := makeTestOrgTemplate1("test", "testOrg")
		ensureCreateOrg(org)
		orgID := org.ID.Uint64()
		systemUserEmail := user.MakeSystemEmail(orgID)

		convey.Convey("create system user success", func() {
			su, err := d.GetOrCreateSystemUserByOrgID(ctx, _db, orgID)
			defer deleteUserByEmail(systemUserEmail)

			convey.So(err, convey.ShouldBeNil)
			convey.So(su, convey.ShouldNotBeNil)
			convey.So(su.ID, convey.ShouldNotBeZeroValue)

			convey.Convey("load system user via GetSystemUserByOrgID", func() {
				user, err := d.Dao().User.GetSystemUserByOrgID(ctx, _db, orgID)
				convey.So(err, convey.ShouldBeNil)
				convey.So(user.ID, convey.ShouldEqual, su.ID)
				convey.So(user.Email, convey.ShouldEqual, systemUserEmail)
			})

			convey.Convey("load system user via GetUserByEmail", func() {
				user, err := d.Dao().User.GetUserByEmail(ctx, _db, systemUserEmail)
				convey.So(err, convey.ShouldBeNil)
				convey.So(user.ID, convey.ShouldEqual, su.ID)
				convey.So(user.Email, convey.ShouldEqual, su.Email)
			})
		})

		convey.Reset(func() {
			ensureDeleteOrg(org)
		})
	})
}
