package gome_live_show

import (
	"encoding/json"
	"errors"
	"git.rosy.net.cn/baseapi/utils"
	"net/http"
)

// 商户商品列表查询
func (a *API) GetMerchantStoreGoodsList(req *QueryStoreGoodsListReq) (*QueryStoreGoodsListRes, error) {
	if req.PageNumber == 0 {
		req.PageNumber = 1
	}
	if req.PageSize == 0 {
		req.PageSize = 50
	}
	byteParam, err := json.Marshal(req)
	if err != nil {
		return nil, err
	}

	gomeResult, err := a.AccessAPI(gomeUrl, GetMerchantGoodsList, http.MethodPost, utils.Struct2FlatMap(a.MakeRequestParam(byteParam)))
	if err != nil {
		return nil, err
	}

	result := &QueryStoreGoodsListRes{}
	if err := utils.Map2StructByJson(gomeResult, result, false); err != nil {
		return nil, err
	}
	if result.Code != 200 {
		return nil, errors.New(result.Message)
	}
	return result, nil
}

// 商品详情查询，包含商品基本信息名称、图片、品类，规格
func (a *API) QueryMerchantStoreGoodsDetail(spuCode string) (*QueryStoreGoodsDetailsRes, error) {
	byteSpuCode, err := json.Marshal(map[string]string{"spuCode": spuCode})
	if err != nil {
		return nil, err
	}
	gomeResult, err := a.AccessAPI(gomeUrl, GetMerchantGoodsDetailList, http.MethodPost, utils.Struct2FlatMap(a.MakeRequestParam(byteSpuCode)))
	if err != nil {
		return nil, err
	}

	result := &QueryStoreGoodsDetailsRes{}
	if err := utils.Map2StructByJson(gomeResult, result, false); err != nil {
		return nil, err
	}
	if result.Code != 200 {
		return nil, errors.New(result.Message)
	}
	return result, nil
}

// 商户创建新的商品
func (a *API) CreateMerchantGoodsOnStore(req *CreateGoodsListToStore) (*SystemParameterRes, error) {
	byteReq, err := json.Marshal(req)
	if err != nil {
		return nil, err
	}

	gomeResult, err := a.AccessAPI(gomeUrl, CreateMerchantGoodsToStore, http.MethodPost, utils.Struct2FlatMap(a.MakeRequestParam(byteReq)))
	if err != nil {
		return nil, err
	}

	result := &SystemParameterRes{}
	if err := utils.Map2StructByJson(gomeResult, result, false); err != nil {
		return nil, err
	}
	if result.Code != 200 {
		return nil, errors.New(result.Message)
	}
	return result, nil
}

// 修改商户商品，商品一旦创建，不可修改商品的品类和类型，只能修改商品的基础信息，如果规格信息有修改，需要同时入参specProperty 和 skuSaleList
func (a *API) UpdateMerchantGoodsOnStore(req *CreateGoodsListToStore) (*SystemParameterRes, error) {
	byteReq, err := json.Marshal(req)
	if err != nil {
		return nil, err
	}

	gomeResult, err := a.AccessAPI(gomeUrl, UpdateMerchantGoodsToStore, http.MethodPost, utils.Struct2FlatMap(a.MakeRequestParam(byteReq)))
	if err != nil {
		return nil, err
	}

	result := &SystemParameterRes{}
	if err := utils.Map2StructByJson(gomeResult, result, false); err != nil {
		return nil, err
	}
	if result.Code != 200 {
		return nil, errors.New(result.Message)
	}
	return result, nil
}

// 不在使用的商户商品可删除
func (a *API) DeleteGoodsOnStore(spuCode string) (*SystemParameterRes, error) {
	param, err := json.Marshal(map[string]string{"spuCode": spuCode})
	if err != nil {
		return nil, err
	}
	gomeResult, err := a.AccessAPI(gomeUrl, DeleteMerchantGoodsToStore, http.MethodPost, utils.Struct2FlatMap(a.MakeRequestParam(param)))
	if err != nil {
		return nil, err
	}

	result := &SystemParameterRes{}
	if err := utils.Map2StructByJson(gomeResult, result, false); err != nil {
		return nil, err
	}
	if result.Code != 200 {
		return nil, errors.New(result.Message)
	}
	return result, nil
}

// 根据店铺编码查询店铺商品列表。
func (a *API) QueryGoodsListById(req *QueryGoodsListForStoreReq) (*QueryGoodsListForStoreRes, error) {
	byteReq, err := json.Marshal(req)
	if err != nil {
		return nil, err
	}

	gomeResult, err := a.AccessAPI(gomeUrl, QueryGoodsListByStoreId, http.MethodPost, utils.Struct2FlatMap(a.MakeRequestParam(byteReq)))
	if err != nil {
		return nil, err
	}

	result := &QueryGoodsListForStoreRes{}
	if err := utils.Map2StructByJson(gomeResult, result, false); err != nil {
		return nil, err
	}
	if result.Code != 200 {
		return nil, errors.New(result.Message)
	}
	return result, nil
}

// 查询单商品接口
func (a *API) QueryOneGoodsForStore(storeCode, skuCode string) (*QueryStoreOneGoodsRes, error) {
	if storeCode == "" || skuCode == "" {
		return nil, errors.New("参数不能为空")
	}

	byteReq, err := json.Marshal(map[string]string{"storeCode": storeCode, "skuCode": skuCode})
	if err != nil {
		return nil, err
	}

	gomeResult, err := a.AccessAPI(gomeUrl, QueryOneGoodsByStoreId, http.MethodPost, utils.Struct2FlatMap(a.MakeRequestParam(byteReq)))
	if err != nil {
		return nil, err
	}

	result := &QueryStoreOneGoodsRes{}
	if err := utils.Map2StructByJson(gomeResult, result, false); err != nil {
		return nil, err
	}
	if result.Code != 200 {
		return nil, errors.New(result.Message)
	}
	return result, nil
}

// 商品上下架操作  功能描述： 商品上下架,支持单商品或多商品；如果商品在审核中或驳回情况下，
//将禁止商户的上架操作,最多支持10 个sku，此接口不会立刻响应成功或失败，需要调用查询接口确定
func (a *API) OnOffLineGoodsOnStore(req *ShelfGoodsForStoreReq) (*SystemParameterRes, error) {
	byteReq, err := json.Marshal(req)
	if err != nil {
		return nil, err
	}

	gomeResult, err := a.AccessAPI(gomeUrl, GoodsOnOffLineByStore, http.MethodPost, utils.Struct2FlatMap(a.MakeRequestParam(byteReq)))
	if err != nil {
		return nil, err
	}

	result := &SystemParameterRes{}
	if err := utils.Map2StructByJson(gomeResult, result, false); err != nil {
		return nil, err
	}
	if result.Code != 200 {
		return nil, errors.New(result.Message)
	}
	return result, nil
}

// 单商品维护售价
func (a *API) UpdateOnGoodsPriceForStore(req *StoreGoodsPriceUpdateReq) (*SystemParameterRes, error) {
	byteReq, err := json.Marshal(req)
	if err != nil {
		return nil, err
	}

	gomeResult, err := a.AccessAPI(gomeUrl, UpdatePriceToOneGoodsByStore, http.MethodPost, utils.Struct2FlatMap(a.MakeRequestParam(byteReq)))
	if err != nil {
		return nil, err
	}

	result := &SystemParameterRes{}
	if err := utils.Map2StructByJson(gomeResult, result, false); err != nil {
		return nil, err
	}
	if result.Code != 200 {
		return nil, errors.New(result.Message)
	}
	return result, nil
}

// 商品库存更新接口
func (a *API) UpdateStockForStore(req *StoreGoodsStockUpdateReq) (*SystemParameterRes, error) {
	byteReq, err := json.Marshal(req)
	if err != nil {
		return nil, err
	}

	gomeResult, err := a.AccessAPI(gomeUrl, UpdateGoodsStockForStore, http.MethodPost, utils.Struct2FlatMap(a.MakeRequestParam(byteReq)))
	if err != nil {
		return nil, err
	}

	result := &SystemParameterRes{}
	if err := utils.Map2StructByJson(gomeResult, result, false); err != nil {
		return nil, err
	}
	if result.Code != 200 {
		return nil, errors.New(result.Message)
	}
	return result, nil
}

// 新增店铺商品
func (a *API) CreateGoodsForStore(req *CreateGoodsForStoreReq) (*SystemParameterRes, error) {
	byteReq, err := json.Marshal(req)
	if err != nil {
		return nil, err
	}

	gomeResult, err := a.AccessAPI(gomeUrl, AddGoodsForStore, http.MethodPost, utils.Struct2FlatMap(a.MakeRequestParam(byteReq)))
	if err != nil {
		return nil, err
	}

	result := &SystemParameterRes{}
	if err := utils.Map2StructByJson(gomeResult, result, false); err != nil {
		return nil, err
	}
	if result.Code != 200 {
		return nil, errors.New(result.Message)
	}
	return result, nil
}
