package common

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

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

// QueryProvincesAndCitiesReq 查询省市信息请求参数
type QueryProvincesAndCitiesReq struct {
	ProvinceID int `form:"provinceID"` // 省ID
}

// QueryProvincesAndCitiesRsp 查询省市信息返回模型
type QueryProvincesAndCitiesRsp struct {
	Province models.Division   // 省
	Cities   []models.Division // 市
}

// QueryProvincesAndCities 查询省市信息（不包括区）
// @Summary 查询省市信息（不包括区）
// @Produce json
// @Param provinceID query int false "省ID"
// @Success 200 {object} QueryProvincesAndCitiesRsp
// @Failure 500 {object} app.Response
// @Router /Common/QueryProvincesAndCities [get]
// @Tags 通用服务
func QueryProvincesAndCities(c *gin.Context) {
	appG := app.Gin{C: c}

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

	// 获取省市信息
	provinces, err := models.GetProvincesAndCities(req.ProvinceID)
	if err != nil {
		// 查询失败
		logger.GetLogger().Errorf("QueryProvincesAndCities failed: %s", err.Error())
		appG.Response(http.StatusBadRequest, e.ERROR_QUERY_FAIL, nil)
		return
	}

	// 分解省市数据
	// Golang Map元素取址问题： cannot assign to struct field XXXX in map
	// https://blog.csdn.net/makenothing/article/details/105037977
	pMap := make(map[string]*QueryProvincesAndCitiesRsp)
	// 构建省节点
	for _, v := range provinces {
		if v.Divisionlevel == "province" {
			pMap[v.Divisioncode] = &QueryProvincesAndCitiesRsp{Province: v, Cities: make([]models.Division, 0)}
		}
	}
	// 为省节点增加市信息
	for _, v := range provinces {
		if v.Divisionlevel == "city" {
			pMap[v.Parentcode].Cities = append(pMap[v.Parentcode].Cities, v)
		}
	}

	// map to slice
	rst := make([]QueryProvincesAndCitiesRsp, 0)
	for _, v := range pMap {
		rst = append(rst, *v)
	}

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

// GetDivisions 查询区域信息
// @Summary 查询区域信息
// @Produce json
// @Success 200 {object} models.Division
// @Failure 500 {object} app.Response
// @Router /Common/GetDivisions [get]
// @Tags 通用服务
func GetDivisions(c *gin.Context) {
	appG := app.Gin{C: c}

	divisions, err := models.GetDivisions()
	if err != nil {
		// 查询失败
		logger.GetLogger().Errorf("GetDivisions failed: %s", err.Error())
		appG.Response(http.StatusBadRequest, e.ERROR_QUERY_FAIL, nil)
		return
	}

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

// QueryImageConfigsReq 查询轮播图配置信息请求参数
type QueryImageConfigsReq struct {
	ImageType int `form:"imageType"`
}

// QueryImageConfigsRsp 查询轮播图配置信息返回模型
type QueryImageConfigsRsp struct {
	Configid   int64     `json:"configid"  xorm:"'CONFIGID'" binding:"required"` // 配置ID(SEQ_SZDZ2_IMAGECONFIG)
	Imagetype  int32     `json:"imagetype"  xorm:"'IMAGETYPE'"`                  // 类型 - 1:首页轮播(移动) 2:我的(移动)
	Title      string    `json:"title"  xorm:"'TITLE'"`                          // 标题
	Imagepath  string    `json:"imagepath"  xorm:"'IMAGEPATH'"`                  // 图片
	URL        string    `json:"url"  xorm:"'URL'"`                              // 链接(地址或商品ID)
	Sort       int64     `json:"sort"  xorm:"'SORT'"`                            // 排序
	Isshow     int32     `json:"isshow"  xorm:"'ISSHOW'"`                        // 是否展示 - 0:不展示 1:展示
	Createdate time.Time `json:"createdate"  xorm:"'CREATEDATE'"`                // 创建时间
	Creatorid  int64     `json:"creatorid"  xorm:"'CREATORID'"`                  // 创建人
	Updatedate time.Time `json:"updatedate"  xorm:"'UPDATEDATE'"`                // 修改时间
	Modifierid int64     `json:"modifierid"  xorm:"'MODIFIERID'"`                // 操作人
	Areauserid int64     `json:"areauserid"  xorm:"'AREAUSERID'"`                // 所属机构ID
	Urltype    int32     `json:"urltype"  xorm:"'URLTYPE'"`                      // 链接类型 - 1:直接地址 2:商品ID

	MarketID  int `json:"marketid"`  // 市场ID
	TradeMode int `json:"trademode"` // 交易模式
}

// QueryImageConfigs 查询轮播图配置信息
// @Summary 查询轮播图配置信息
// @Produce json
// @Param imageType query int false "类型 - 1:App首页轮播 2:我的"
// @Success 200 {object} QueryImageConfigsRsp
// @Failure 500 {object} app.Response
// @Router /Common/QueryImageConfigs [get]
// @Tags 通用服务
func QueryImageConfigs(c *gin.Context) {
	appG := app.Gin{C: c}

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

	imageConfigs, err := models.GetImageConfigs(req.ImageType)
	if err != nil {
		// 查询失败
		logger.GetLogger().Errorf("QueryImageConfigs failed: %s", err.Error())
		appG.Response(http.StatusBadRequest, e.ERROR_QUERY_FAIL, nil)
		return
	}

	rst := make([]QueryImageConfigsRsp, 0)
	for _, v := range imageConfigs {
		item := QueryImageConfigsRsp{
			Configid:   v.Configid,
			Imagetype:  v.Imagetype,
			Title:      v.Title,
			Imagepath:  v.Imagepath,
			URL:        v.URL,
			Sort:       v.Sort,
			Isshow:     v.Isshow,
			Createdate: v.Createdate,
			Creatorid:  v.Creatorid,
			Updatedate: v.Updatedate,
			Modifierid: v.Modifierid,
			Areauserid: v.Areauserid,
			Urltype:    v.Urltype,
		}

		if item.Urltype == 2 {
			if i, err := strconv.Atoi(v.URL); err == nil {
				if market, _ := models.GetMarketByGoodsID(i); market != nil {
					item.MarketID = int(market.Marketid)
					item.TradeMode = int(market.Trademode)
				}
			}

		}

		rst = append(rst, item)
	}

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

// GetAllEnumsReq 获取所有枚举信息请求参数
type GetAllEnumsReq struct {
	Autoid int `form:"autoid"`
}

// GetAllEnums 获取所有枚举信息
// @Summary 获取所有枚举信息
// @Description autoid传入后则返回这个ID之后的数据；如不传则返回所有
// @Produce json
// @Param autoid query int false "起始自增ID"
// @Success 200 {object} models.Enumdicitem
// @Failure 500 {object} app.Response
// @Router /Common/GetAllEnums [get]
// @Tags 通用服务
func GetAllEnums(c *gin.Context) {
	appG := app.Gin{C: c}

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

	enums, err := models.GetEnums(req.Autoid)
	if err != nil {
		// 查询失败
		logger.GetLogger().Errorf("GetAllEnums failed: %s", err.Error())
		appG.Response(http.StatusBadRequest, e.ERROR_QUERY_FAIL, nil)
		return
	}

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

// GetServerTime 获取服务器时间
// @Summary 获取服务器时间
// @Produce json
// @Success 200 {object} app.Response
// @Failure 500 {object} app.Response
// @Router /Common/GetServerTime [get]
// @Tags 通用服务
func GetServerTime(c *gin.Context) {
	appG := app.Gin{C: c}

	rst, err := models.GetServerTime()
	if err != nil {
		// 查询失败
		logger.GetLogger().Errorf("GetServerTime failed: %s", err.Error())
		appG.Response(http.StatusBadRequest, e.ERROR_QUERY_FAIL, nil)
		return
	}

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