package message

import (
	"context"
	"log"
	"os"
	"testing"

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

var db *gorm.DB

func init() {
	var err error
	db, err = docker_db.TryInitCentralDB(true)
	if err != nil {
		log.Printf("Failed to init docker db: %s", err)
		os.Exit(-1)
		return
	}
}

func deleteByID(id uint64) {
	db.Where("id = ?", id).Delete(&entity.EmailReminder{})
}

func TestMessageDao_CreateEmailReminder(t *testing.T) {
	ctx := context.TODO()
	d := &MessageDao{}
	const (
		orgID      = uint64(1)
		scene      = "scene"
		identifier = "id1"
	)

	convey.Convey("Create Email Reminder", t, func() {
		convey.Convey("insert not exists", func() {
			emailReminder, err := d.CreateEmailReminder(ctx, db, orgID, scene, identifier)
			convey.So(err, convey.ShouldBeNil)
			convey.So(emailReminder, convey.ShouldNotBeNil)
			defer deleteByID(emailReminder.ID.Uint64())

			convey.Convey("insert duplicated", func() {
				emailReminder, err := d.CreateEmailReminder(ctx, db, orgID, scene, identifier)
				convey.So(err, convey.ShouldNotBeNil)
				convey.So(emailReminder, convey.ShouldBeNil)
			})

			convey.Convey("insert non-duplicated", func() {
				emailReminder, err := d.CreateEmailReminder(ctx, db, orgID+1, scene, identifier)
				convey.So(err, convey.ShouldBeNil)
				convey.So(emailReminder, convey.ShouldNotBeNil)
				defer deleteByID(orgID + 1)
			})
		})
	})
}

func TestMessageDao_GetEmailReminder(t *testing.T) {
	ctx := context.TODO()
	d := &MessageDao{}
	const (
		orgID      = uint64(1)
		scene      = "scene"
		identifier = "id1"
	)

	convey.Convey("Get Email Reminder", t, func() {
		convey.Convey("insert not exists", func() {
			emailReminder, err := d.CreateEmailReminder(ctx, db, orgID, scene, identifier)
			convey.So(err, convey.ShouldBeNil)
			convey.So(emailReminder, convey.ShouldNotBeNil)
			defer deleteByID(emailReminder.ID.Uint64())

			emailReminder2, err := d.GetEmailReminder(ctx, db, orgID, scene, identifier)
			convey.So(err, convey.ShouldBeNil)
			convey.So(emailReminder2.ID.Uint64(), convey.ShouldEqual, emailReminder.ID.Uint64())
		})
	})
}

func TestMessageDao_DeleteEmailReminder(t *testing.T) {
	ctx := context.TODO()
	d := &MessageDao{}
	const (
		orgID      = uint64(1)
		scene      = "scene"
		identifier = "id1"
	)

	convey.Convey("Delete Email Reminder", t, func() {
		convey.Convey("insert not exists", func() {
			emailReminder, err := d.CreateEmailReminder(ctx, db, orgID, scene, identifier)
			convey.So(err, convey.ShouldBeNil)
			convey.So(emailReminder, convey.ShouldNotBeNil)

			err = d.DeleteEmailReminder(ctx, db, orgID, scene, identifier)
			convey.So(err, convey.ShouldBeNil)

			err = d.DeleteEmailReminder(ctx, db, orgID, scene, identifier)
			convey.So(err, convey.ShouldBeNil)
		})
	})
}
