package controllers

import (
	"fmt"
	"git.rosy.net.cn/jx-callback/business/jxstore/cms"
	"sort"

	"git.rosy.net.cn/baseapi/utils"
	"git.rosy.net.cn/jx-callback/business/jxutils"
	"git.rosy.net.cn/jx-callback/business/model"
	"git.rosy.net.cn/jx-callback/business/model/dao"
	"git.rosy.net.cn/jx-callback/business/netspider"
	"github.com/astaxie/beego/server/web"
)

type NetSpiderController struct {
	web.Controller
}

// @Title 从网页拉取平台门店信息
// @Description 从网页拉取平台门店信息
// @Param	token			header		string	true	"认证token"
// @Param	vendorIDs		formData	string	false	"厂商ID列表"
// @Param	cityCodes		formData	string	false	"城市列表，缺省为后台启用了的城市"
// @Param	radius			formData	int		false	"区域半径（市或街道的半径会自动增加或缩小），单位为米，缺省8000米"
// @Param	gridWith		formData	int		false	"网格大小，单位为米，缺省为2000米"
// @Param	isShuffle		formData	bool	false	"是否将城市列表随机打乱"
// @Param	isAsync			formData	bool	false	"是否异步"
// @Success 200 {object} controllers.CallResult
// @Failure 200 {object} controllers.CallResult
// @router /GetAndStoreCitiesShops [post]
func (c *NetSpiderController) GetAndStoreCitiesShops() {
	c.callGetAndStoreCitiesShops(func(params *tNetspiderGetAndStoreCitiesShopsParams) (retVal interface{}, errCode string, err error) {
		var vendorIDs, cityCodes []int
		err = jxutils.Strings2Objs(params.VendorIDs, &vendorIDs, params.CityCodes, &cityCodes)
		if err == nil {
			retVal, err = netspider.GetAndStoreCitiesShops(params.Ctx, vendorIDs, cityCodes, params.Radius, params.GridWith, params.IsShuffle, params.IsAsync)
		}
		return retVal, "", err
	})
}

// @Title 同步商家商品信息   1
// @Description 同步商家商品信息
// @Param	token			header		string	true	"认证token"
// @Param	offset			query		int		false	"列表起始序号（以0开始，缺省为0）"
// @Param	pageSize		query		int		false	"列表页大小（缺省为50，-1表示全部）"
// @Param	keyword			query		string	false	"查询关键字（可以为空，为空表示不限制）"
// @Param	vendorStoreID	query		string	false	"门店号"
// @Param	vendorID		query		int		false	"平台ID"
// @Param	cityCode		query		int		false	"城市代码"
// @Param	districtCode	query		int		false	"行政区代码"
// @Param	tel				query		string	false	"手机号"
// @Param	brandName			query		string	false	"品牌名"
// @Param	minShopScore		query		float64	false	"门店分值最小值"
// @Param	minRecentOrderNum	query		int		false	"最近单量最小值"
// @Param	minSkuCount			query		int		false	"SKU数量最小值"
// @Param	radius				query		int		false	"关注点半径（米）"
// @Param	lng					query		string	false	"关注点经度"
// @Param	lat					query		string	false	"关注点纬度"
// @Param	cat					query		string	false	"分类"
// @Success 200 {object} controllers.CallResult
// @Failure 200 {object} controllers.CallResult
// @router /QueryPageStores [get]
func (c *NetSpiderController) QueryPageStores() {
	c.callQueryPageStores(func(params *tNetspiderQueryPageStoresParams) (retVal interface{}, errCode string, err error) {
		if params.MapData["vendorID"] == nil {
			params.VendorID = -1
		}
		var lng, lat, lng1, lat1, lng2, lat2 float64
		params.Offset = jxutils.FormalizePageOffset(params.Offset)
		params.PageSize = jxutils.FormalizePageSize(params.PageSize)
		offset := params.Offset
		pageSize := params.PageSize
		if params.Radius > 0 {
			lng = utils.Str2Float64WithDefault(params.Lng, 0)
			lat = utils.Str2Float64WithDefault(params.Lat, 0)
			if lng == 0 || lat == 0 {
				return nil, "", fmt.Errorf("坐标信息%s,%s不合法", params.Lng, params.Lat)
			}
			lng2, _ = jxutils.ConvertDistanceToLogLat(lng, lat, float64(params.Radius), 90)
			_, lat2 = jxutils.ConvertDistanceToLogLat(lng, lat, float64(params.Radius), 0)
			lng1 = lng - (lng2 - lng)
			lat1 = lat - (lat2 - lat)
			offset = 0
			pageSize = model.UnlimitedPageSize
		}
		pagedInfo, err := cms.QueryPageStores2(dao.GetDB(), pageSize, offset, params.Keyword, params.VendorStoreID, params.BrandName, params.VendorID,
			params.CityCode, params.DistrictCode, params.Tel, float32(params.MinShopScore), params.MinRecentOrderNum, params.MinSkuCount,
			lng1, lat1, lng2, lat2, params.Cat)
		if err == nil {
			if params.Radius > 0 && (params.Offset != 0 || params.PageSize != model.UnlimitedPageSize) {
				shopList2, _ := pagedInfo.Data.([]*dao.PageShopWithPlaceName)
				var shopList []*dao.PageShopWithPlaceName
				pagedInfo.TotalCount = 0
				if len(shopList2) > 0 {
					for _, v := range shopList2 {
						v.Distance = int(jxutils.EarthDistance(v.Lng, v.Lat, lng, lat) * 1000)
						if v.Distance < 0 {
							v.Distance = 0
						}
						if v.Distance <= params.Radius {
							shopList = append(shopList, v)
						}
					}
					pagedInfo.TotalCount = len(shopList)
					if pagedInfo.TotalCount > 0 {
						sort.Sort(PageShopList(shopList))
						if params.Offset < len(shopList) {
							index := params.Offset + params.PageSize
							if index > len(shopList) {
								index = len(shopList)
							}
							shopList = shopList[params.Offset:index]
						} else {
							shopList = nil
						}
					}
				}
				pagedInfo.Data = shopList
			}
			retVal = pagedInfo
		}
		return retVal, "", err
	})
}

type PageShopList []*dao.PageShopWithPlaceName

func (l PageShopList) Len() int {
	return len(l)
}

func (l PageShopList) Less(i, j int) bool {
	return l[i].Distance < l[j].Distance
}

func (l PageShopList) Swap(i, j int) {
	l[i], l[j] = l[j], l[i]
}

// @Title 刷新网页门店信息
// @Description 刷新网页门店信息
// @Param	token			header		string	true	"认证token"
// @Success 200 {object} controllers.CallResult
// @Failure 200 {object} controllers.CallResult
// @router /RefreshPageShops [post]
func (c *NetSpiderController) RefreshPageShops() {
	c.callRefreshPageShops(func(params *tNetspiderRefreshPageShopsParams) (retVal interface{}, errCode string, err error) {
		err = netspider.RefreshPageShops(params.Ctx)
		return retVal, "", err
	})
}

// @Title 参考信息，商品搜索
// @Description  参考信息，商品搜索
// @Param	token			header		string	true	"认证token"
// @Param	vendorID		query		int		false	"平台ID"
// @Param	vendorStoreIDs	query		string	false	"门店IDs"
// @Param	keyword			query		string	false	"关键字"
// @Param	cityCode		query		int		false	"城市"
// @Param	lng				query		string	false	"关注点经度"
// @Param	lat				query		string	false	"关注点纬度"
// @Param	radius			query		int		false	"半径（米）"
// @Param	sortType		query		int		false	"1表示销量，2表示距离 正是升序，负是倒序"
// @Param	offset			query		int		false	"列表起始序号（以0开始，缺省为0）"
// @Param	pageSize		query		int		false	"列表页大小（缺省为50，-1表示全部）"
// @Success 200 {object} controllers.CallResult
// @Failure 200 {object} controllers.CallResult
// @router /QueryPageSkus [get]
func (c *NetSpiderController) QueryPageSkus() {
	c.callQueryPageSkus(func(params *tNetspiderQueryPageSkusParams) (retVal interface{}, errCode string, err error) {
		var vendorStoreIDs []string
		jxutils.Strings2Objs(params.VendorStoreIDs, &vendorStoreIDs)
		var lng, lat, lng1, lat1, lng2, lat2 float64
		params.Offset = jxutils.FormalizePageOffset(params.Offset)
		params.PageSize = jxutils.FormalizePageSize(params.PageSize)
		offset := params.Offset
		pageSize := params.PageSize
		if params.Radius > 0 {
			lng = utils.Str2Float64WithDefault(params.Lng, 0)
			lat = utils.Str2Float64WithDefault(params.Lat, 0)
			if lng == 0 || lat == 0 {
				return nil, "", fmt.Errorf("坐标信息%s,%s不合法", params.Lng, params.Lat)
			}
			lng2, _ = jxutils.ConvertDistanceToLogLat(lng, lat, float64(params.Radius), 90)
			_, lat2 = jxutils.ConvertDistanceToLogLat(lng, lat, float64(params.Radius), 0)
			lng1 = lng - (lng2 - lng)
			lat1 = lat - (lat2 - lat)
		}
		retVal, err = cms.QueryPageSkus(params.Ctx, params.VendorID, vendorStoreIDs, params.Keyword, params.CityCode, lng, lat, lng1, lat1, lng2, lat2, params.Radius, params.SortType, offset, pageSize)
		return retVal, "", err
	})
}

// @Title 查询page品牌
// @Description 查询page品牌
// @Param	token			header		string	true	"认证token"
// @Success 200 {object} controllers.CallResult
// @Failure 200 {object} controllers.CallResult
// @router /GetPageBrands [get]
func (c *NetSpiderController) GetPageBrands() {
	c.callGetPageBrands(func(params *tNetspiderGetPageBrandsParams) (retVal interface{}, errCode string, err error) {
		retVal, err = cms.GetPageBrands(params.Ctx)
		return retVal, "", err
	})
}
