package controller

import (
	"dataservices/commons/ginparser"
	"dataservices/commons/logger"
	dto "dataservices/internal/dto/dataapi_control"
	"time"

	service "dataservices/internal/service/dataapi_control"

	"github.com/gin-gonic/gin"
	"github.com/tidbcloud/tiinf/errs"
	"github.com/tidbcloud/tiinf/monitor/tilog"
	"go.uber.org/zap"
)

func UserExecutionLogQuery(c *gin.Context) {
	ctx := c.Request.Context()
	params := ginparser.NewCommonParamsByGin(c)
	createdBy, _ := params.GetUserEmail()
	startTime := time.Now()
	failResAndLog := func(err errs.Error) {
		c.JSON(err.HTTPCode(), dto.NewErrorToBaseResp(err.HTTPCode(), err.ErrMsg()))
		tilog.Error(ctx, "DS-Region-Dataapi-Control-/apps/:app_id/dataapp-log/query[post]-UserExecutionLogQuery failed",
			zap.Uint64("app-id", params.AppID),
			zap.Duration("cost", time.Since(startTime)),
			zap.Error(err),
			zap.String("user", createdBy))
	}

	var req dto.QueryUserExecutionLogReq
	terr := parseParamFromBody(c, &req)
	if terr != nil {
		failResAndLog(terr)
		return
	}
	logger.Info(ctx, "UserExecutionLogQuery begin", zap.Any("payload", req), zap.Any("header", c.Request.Header))
	res, err := service.ExecuteQuery(ctx, &req)
	if err != nil {
		failResAndLog(errs.NewInternalHTTP("execute faile", err))
		return
	}
	c.JSON(200, res)
}

func SubmitDownloadDataAppLogTask(c *gin.Context) {
	ctx := c.Request.Context()
	params := ginparser.NewCommonParamsByGin(c)
	createdBy, _ := params.GetUserEmail()
	startTime := time.Now()
	failResAndLog := func(err errs.Error) {
		c.JSON(err.HTTPCode(), dto.NewErrorToBaseResp(err.HTTPCode(), err.ErrMsg()))
		tilog.Error(ctx, "DS-Region-Dataapi-Control-/apps/:app_id/custom-domains/:host[delete]-HandleDeleteCustomDomain failed",
			zap.Uint64("app-id", params.AppID),
			zap.Duration("cost", time.Since(startTime)),
			zap.Error(err),
			zap.String("user", createdBy))
	}

	var req dto.DownloadLogReq
	terr := parseParamFromBody(c, &req)
	if terr != nil {
		failResAndLog(terr)
		return
	}
	err := service.ExecuteDownload(ctx, &req)
	if err != nil {
		failResAndLog(errs.NewInternalHTTP("execute faile", err))
		return
	}
	var res dto.BaseResp
	c.JSON(200, res)
}
