package common

import (
	"mtp2_if/global/app"
	"mtp2_if/global/e"
	"mtp2_if/logger"
	"mtp2_if/models"
	"net/http"

	"github.com/gin-gonic/gin"
)

// QueryTraderMenuReq 查询交易端菜单请求参数
type QueryTraderMenuReq struct {
	LoginID int `form:"loginid" binding:"required"`
}

// QueryTraderMenuRsp 交易端菜单
type QueryTraderMenuRsp struct {
	QuoteMenu     []models.QuotePrimaryMenu     `json:"QuoteMenu"`     // 报价牌分类菜单
	OperationMenu []models.OperationPrimaryMenu `json:"OperationMenu"` // 功能菜单
}

// QueryTraderMenu 查询交易端菜单
// @Summary 查询交易端菜单
// @Produce json
// @Param loginid query int true "登录账号"
// @Success 200 {object} QueryTraderMenuRsp
// @Failure 500 {object} app.Response
// @Router /Common/QueryTraderMenu [get]
// @Tags 通用服务
func QueryTraderMenu(c *gin.Context) {
	appG := app.Gin{C: c}

	// 获取请求参数
	var req QueryTraderMenuReq
	if err := appG.C.ShouldBindQuery(&req); err != nil {
		logger.GetLogger().Errorf("QueryTraderMenu failed: %s", err.Error())
		appG.Response(http.StatusBadRequest, e.INVALID_PARAMS, nil)
		return
	}

	var queryTraderMenuRsp QueryTraderMenuRsp
	// 获取行情报价牌分类菜单
	if datas, err := models.GetQuoteMenu(req.LoginID); err == nil {
		queryTraderMenuRsp.QuoteMenu = datas
	} else {
		logger.GetLogger().Errorf("QueryTraderMenu failed: %s", err.Error())
		appG.Response(http.StatusBadRequest, e.ERROR_QUERY_QUOTEMENU_FAIL, nil)
		return
	}
	// 获取功能菜单
	if datas, err := models.GetOperationMenu(); err == nil {
		queryTraderMenuRsp.OperationMenu = datas
	} else {
		logger.GetLogger().Errorf("QueryTraderMenu failed: %s", err.Error())
		appG.Response(http.StatusBadRequest, e.ERROR_QUERY_OPERATIONMENU_FAIL, nil)
		return
	}

	// 查询成功
	logger.GetLogger().Debugln("QueryTraderMenu successed: %v", queryTraderMenuRsp)
	appG.Response(http.StatusOK, e.SUCCESS, queryTraderMenuRsp)
}

// QueryTableDefineReq 查询交易端列表头信息请求参数
type QueryTableDefineReq struct {
	TableKey  string `form:"tableKey"`
	TableType int    `form:"tableType"`
}

// QueryTableDefineRsp 查询交易端列表头信息返回模型
type QueryTableDefineRsp struct {
	models.Tabledefine `xorm:"extends"`
	Columns            []models.Tablecolumnconfig `json:"columns" xorm:"-"` // 列头信息数组
}

// QueryTableDefine 查询交易端列表头信息
// @Summary 查询交易端列表头信息
// @Produce json
// @Param tableKey query string false "表key"
// @Param tableType query int false "列表类型 - 1：管理端 2：H5终端 3：移动终端"
// @Success 200 {object} QueryTableDefineRsp
// @Failure 500 {object} app.Response
// @Router /Common/QueryTableDefine [get]
// @Tags 通用服务
func QueryTableDefine(c *gin.Context) {
	appG := app.Gin{C: c}

	// 获取请求参数
	var req QueryTableDefineReq
	if err := appG.C.ShouldBindQuery(&req); err != nil {
		logger.GetLogger().Errorf("QueryTableDefine failed: %s", err.Error())
		appG.Response(http.StatusBadRequest, e.INVALID_PARAMS, nil)
		return
	}

	rst := make([]QueryTableDefineRsp, 0)

	// 获取表定义
	tableDefines, err := models.GetClientTableDefines(req.TableKey, req.TableType)
	if err != nil {
		logger.GetLogger().Errorf("QueryTableDefine failed: %s", err.Error())
		appG.Response(http.StatusBadRequest, e.ERROR_QUERY_FAIL, nil)
		return
	}
	for i, v := range tableDefines {
		var queryTableDefineRsp QueryTableDefineRsp

		// 表数据
		queryTableDefineRsp.Tabledefine = tableDefines[i]
		// 获取列表数据
		tablecolumnconfigs, err := models.GetClientTableColumns(v.Tablekey, int(v.Tabletype))
		if err != nil {
			logger.GetLogger().Errorf("QueryTableDefine failed: %s", err.Error())
			appG.Response(http.StatusBadRequest, e.ERROR_QUERY_FAIL, nil)
			return
		}
		queryTableDefineRsp.Columns = tablecolumnconfigs

		rst = append(rst, queryTableDefineRsp)
	}

	// 查询成功
	logger.GetLogger().Debugln("QueryTableDefine successed: %v", rst)
	appG.Response(http.StatusOK, e.SUCCESS, rst)
}
