package auditlog

import (
	"github.com/tidbcloud/account/commons/database"
	"github.com/tidbcloud/account/internel/dao/accesslog"
	"github.com/tidbcloud/account/internel/dao/entity"
	"gorm.io/gorm"
	"gorm.io/gorm/clause"
)

const (
	ClusterNameUniqueErrMsg = "The cluster name must be unique in an organization."
)

type AccessLog struct {
	ID         uint64
	HappenedOn int64
	User       string
	Content    string
}

type ListAccessLogQuery struct {
	StartTimeInSec int64
	EndTimeInSec   int64
	User           string
	Content        string
	From           int
	Size           int
}

func ListAuditLogs(tenantID entity.ID, query *ListAccessLogQuery) ([]AccessLog, int64, error) {
	var (
		items []entity.AuditLog
		count int64
	)
	err := database.Transaction(func(tx *gorm.DB) error {
		var err error
		items, count, err = accesslog.ListAccessLog(tx, tenantID, &accesslog.ListAccessLogQuery{
			StartTimeInSec: query.StartTimeInSec,
			EndTimeInSec:   query.EndTimeInSec,
			User:           query.User,
			Content:        query.Content,
			From:           query.From,
			Size:           query.Size,
		})
		return err
	})
	if err != nil {
		return nil, 0, err
	}

	var ret []AccessLog
	for _, item := range items {
		ret = append(ret, AccessLog{
			ID:         item.ID.Uint64(),
			HappenedOn: item.CreatedAt.Unix(),
			User:       item.User,
			Content:    item.Content,
		})
	}
	return ret, count, nil
}

func GetStartIndex(page int, itemsPerPage int) int {
	if page <= 0 {
		page = 1
	}
	return (page - 1) * GetSize(itemsPerPage)
}

func GetSize(itemsPerPage int) int {
	if itemsPerPage <= 0 {
		itemsPerPage = 10
	}
	return itemsPerPage
}

func LockTenant(tx *gorm.DB, tenantID entity.ID) {
	var tenant entity.Tenant
	tx.Clauses(clause.Locking{Strength: "UPDATE"}).Model(&entity.Tenant{}).Where("id=?", tenantID.Uint64()).Scan(&tenant)
}
