package model

import (
	"time"

	"github.com/pingcap/errors"
	"gorm.io/gorm"

	"github.com/pingcap-inc/clinic/pkg/db"
	"github.com/pingcap-inc/clinic/pkg/pagination"
)

func CreateSlogan(orgID uint, clusterID, text string) (*db.Slogan, error) {
	var slogan db.Slogan
	err := db.Transaction(func(tx *gorm.DB) error {
		slogan = db.Slogan{
			Model: gorm.Model{
				CreatedAt: time.Now(),
				UpdatedAt: time.Now(),
			},
			ClusterID: clusterID,
			OrgID:     orgID,
			Text:      text,
		}

		return (&slogan).Create(tx)
	})

	return &slogan, err
}

func DeleteSlogan(id int) error {
	return db.Transaction(func(tx *gorm.DB) error {
		return tx.Where("id = ?", id).Unscoped().Delete(&db.Slogan{}).Error
	})
}

func ListSlogans(orgID uint, clusterID string, page, perPage int) ([]db.Slogan, int64, error) {
	var (
		slogans []db.Slogan
		total   int64
		err     error
	)

	err = db.Transaction(func(tx *gorm.DB) error {
		qs := db.NewSloganQuerySet(tx)
		if orgID > 0 {
			qs = qs.OrgIDEq(orgID)
		}

		if clusterID != "" {
			qs = qs.ClusterIDEq(clusterID)
		}

		if perPage > 0 {
			if total, err = qs.Count(); err != nil {
				return errors.Annotate(err, "count tenant error")
			}

			startIndex := pagination.GetStartIndex(page, perPage)
			qs = qs.Limit(perPage).Offset(startIndex)
		}

		if err := qs.OrderDescByUpdatedAt().All(&slogans); err != nil {
			return err
		}

		if perPage <= 0 {
			// no pagination
			total = int64(len(slogans))
		}

		return nil
	})
	if err != nil {
		return nil, 0, err
	}

	return slogans, total, nil
}
