package controller

import (
	"bytes"
	"encoding/json"
	"fmt"
	"io/ioutil"
	"time"

	"dataservices/commons/errs"
	"dataservices/commons/ginparser"
	commonhttp "dataservices/commons/http"
	"dataservices/commons/utils"
	"dataservices/internal/entity"
	service "dataservices/internal/service/central"

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

func Chat2Query(c *gin.Context) {
	ctx := c.Request.Context()
	validateKeys := &[]string{ginparser.PARAM_ORG_ID, ginparser.PARAM_PROJECT_ID, ginparser.PARAM_APP_ID}
	params := ginparser.NewCommonParamsByGin(c)
	createdBy, _ := params.GetUserEmail()
	validateErr := params.ValidateUrl(validateKeys)
	if validateErr != nil {
		tilog.Error(ctx, "DS-Central-/orgs/{org_id}/projects/{project_id}/apps/{app_id}/endpoints[proxy]-Chat2Query param validate failed!", zap.Error(validateErr), zap.String("user", createdBy))
		c.Error(validateErr)
		return
	}

	appInfo, err := service.GetDataApp(ctx, params.AppID)
	if err != nil {
		tilog.Error(ctx, "DS-Central-/orgs/{org_id}/projects/{project_id}/apps/{app_id}/endpoints[proxy]-Chat2Query get app info failed!", zap.Error(err), zap.String("user", createdBy))
		c.Error(err)
		return
	}

	if appInfo.AppType != entity.DataAppTypeChat2Query {
		tilog.Error(ctx, "DS-Central-/orgs/{org_id}/projects/{project_id}/apps/{app_id}/endpoints[proxy]-Chat2Query app type is not chat2query!", zap.String("user", createdBy))
		c.Error(errs.NewBadRequest("App type is not chat2query", nil))
		return
	}

	timeout := time.Duration(1) * time.Minute

	bodyBytes, err := json.Marshal(params.JsonParams)
	if err != nil {
		tilog.Error(ctx, "DS-Central-/orgs/{org_id}/projects/{project_id}/apps/{app_id}/endpoints[proxy]-Chat2Query marshal json failed!", zap.Error(err), zap.String("user", createdBy))
	} else {
		c.Request.Body = ioutil.NopCloser(bytes.NewReader(bodyBytes))
	}

	c.Request.Header.Set("X-Resp-Format", "dataservice")

	resp, httpCode, err := commonhttp.ProxyToEDAService(ctx, appInfo, c.Request, c.Request.Method, timeout)
	tilog.Info(ctx, "request global eda service", zap.String("method", c.Request.Method), zap.String("url", c.Request.URL.Path), zap.Int("httpCode", httpCode), zap.Error(err))
	if err != nil {
		if utils.IsTimeoutError(err) {
			err = errs.NewBadRequest(fmt.Sprintf("Call endpoint timeout, timeout is %s", timeout.String()), err)
			c.Error(err)
		} else {
			c.Error(err)
		}

		return
	}

	c.Status(httpCode)
	c.Header("Content-Type", "application/json")
	c.Writer.WriteString(resp)
}
