package api

import (
	"fmt"
	"time"

	"github.com/gin-gonic/gin"
	"github.com/pingcap/dbaas/billing2/billing_errors"
	"github.com/pingcap/dbaas/billing2/forms"
	"github.com/pingcap/dbaas/billing2/model/billing"
	"github.com/pingcap/dbaas/billing2/utils/ginutils"
)

type auditLogAPI struct{}

// @Summary List AuditLog
// @Schemes
// @Accept json
// @Produce json
// @Param tenant_id path string true "tenant_id"
// @Param operator_id path string true "operator_id"
// @Param action path string true "action"
// @Param start_date path string true "start_date"
// @Param end_date path string true "end_date"
// @Param page path string true "page"
// @Param page_size path string true "page_size"
// @Success 200 {object} []forms.AuditLog
// @Router /auditlog [get]
func (s *auditLogAPI) ListAuditLog(c *gin.Context) (ginutils.HandlerFuncResult, error) {
	query := &forms.AuditLogSearchQuery{}
	if err := c.ShouldBindQuery(query); err != nil {
		return nil, billing_errors.NewInvalidInputError(err)
	}
	now := time.Now().UTC()
	if query.PageSize > 100 {
		return nil, billing_errors.NewInvalidInputError(fmt.Errorf("page_size should be less than 100"))
	}
	if query.StartDate.IsZero() {
		if !query.EndDate.IsZero() {
			return nil, billing_errors.NewInvalidInputError(fmt.Errorf("`end_date` cannot be specified alone"))
		}
		query.StartDate = time.Date(now.Year(), now.Month(), 1, 0, 0, 0, 0, time.UTC)
	}
	if query.StartDate.After(now) {
		return nil, billing_errors.NewInvalidInputError(fmt.Errorf("`start_date` should be less than now"))
	}
	if query.EndDate.IsZero() {
		query.EndDate = now
	}
	if query.EndDate.Before(query.StartDate) {
		return nil, billing_errors.NewInvalidInputError(fmt.Errorf("`end_date` cannot be less than `start_date`"))
	}
	model := &billing.AuditLogModel{}
	return model.GetAuditLog(query)
}

func InitializeAuditLogRouter(router ginutils.MyRoute) {
	s := &auditLogAPI{}
	router.HandleWithError("GET", "/auditlog", s.ListAuditLog)
}
