package accesslog

// Database access should be done through this file.
import (
	"time"

	"github.com/pingcap/errors"
	"github.com/tidbcloud/account/internel/dao/entity"
	"gorm.io/gorm"
)

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

func ListAccessLog(tx *gorm.DB, tenantID entity.ID, query *ListAccessLogQuery) ([]entity.AuditLog, int64, error) {
	qs := entity.NewAuditLogQuerySet(tx)
	if tenantID.Uint64() != 0 {
		qs = qs.TenantIDEq(tenantID)
	}
	if query.StartTimeInSec > 0 {
		qs = qs.CreatedAtGte(time.Unix(query.StartTimeInSec, 0))
	}
	if query.EndTimeInSec > 0 {
		qs = qs.CreatedAtLte(time.Unix(query.EndTimeInSec, 0))
	}
	if query.User != "" {
		qs = qs.UserEq(query.User)
	}
	if query.Content != "" {
		qs = entity.NewAuditLogQuerySet(qs.GetDB().Where("content like ?", "%"+query.Content+"%"))
	}
	count, err := qs.Count()
	if err != nil {
		return nil, 0, errors.Annotate(err, "failed to query access log count")
	}
	var items []entity.AuditLog
	if err := qs.Offset(query.From).Limit(query.Size).OrderDescByCreatedAt().All(&items); err != nil {
		return nil, 0, errors.Annotate(err, "failed to query access log")
	}
	return items, count, nil
}

func AddAccessLogNow(tx *gorm.DB, tenantID entity.ID, user, content string) error {
	return AddAccessLog(tx, tenantID, user, content, time.Now().Unix())
}

func AddAccessLog(tx *gorm.DB, tenantID entity.ID, user string, content string, happen int64) error {
	accessLog := entity.AuditLog{
		TenantID: tenantID,
		User:     user,
		Content:  content,
		Base: entity.Base{
			CreatedAt: time.Unix(happen, 0),
		},
	}
	return errors.Annotate(tx.Create(&accessLog).Error, "add access log failed")
}
