package gome_live_show

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

// 根据创建时间查询订单的列表信息
// 为了防止访问及返回的压力过大，可支持的时间区间查询范围，
// 不允许超过 30 分钟，每页显示 10 条；正常频率查询：增量查询，建议1~3 分钟查询一次，
// 查询开始时间为上次查询结束时间，查询结束时间为当前 1~3 分钟之前；补充频率查询：为了防止数据遗漏，
// 建议10分钟查询一次。例如当前时间为 10:50，查询区间为10:10~10:30，具体细节有调用方把握，减少数据遗漏的可能性
func (a *API) QueryOrderListByTime(req *QueryOrderListForTimeReq) (*QueryOrderListForTimeRes, error) {
	byteReq, err := json.Marshal(req)
	if err != nil {
		return nil, err
	}

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

	result := &QueryOrderListForTimeRes{}
	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) QueryOrderDetail(orderNo string) (*QueryOrderDetailRes, error) {
	byteReq, err := json.Marshal(map[string]string{"orderNo": orderNo})
	if err != nil {
		return nil, err
	}

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

	result := &QueryOrderDetailRes{}
	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) CancelOrder(orderNo string) (*SystemParameterRes, error) {
	byteReq, err := json.Marshal(map[string]string{"orderNo": orderNo})
	if err != nil {
		return nil, err
	}

	gomeResult, err := a.AccessAPI(gomeUrl, CancelOrder, 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) ConfirmOrder(orderNo string) (*SystemParameterRes, error) {
	byteReq, err := json.Marshal(map[string]string{"orderNo": orderNo})
	if err != nil {
		return nil, err
	}

	gomeResult, err := a.AccessAPI(gomeUrl, ConfirmOrder, 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) DeliveryOrder(param *DeliveryOrderReq) (*SystemParameterRes, error) {
	byteReq, err := json.Marshal(param)
	if err != nil {
		return nil, err
	}

	gomeResult, err := a.AccessAPI(gomeUrl, DeliveryOrder, 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
}

// 核销接口此接口主要用于 C 端用户下单自提，商家核销场景，核销成功订单状态变成已完成(订单号/核销码)
func (a *API) CheckOrder(orderNo, deliverCheckCode string) (*SystemParameterRes, error) {
	byteReq, err := json.Marshal(map[string]string{"orderNo": orderNo, "deliverCheckCode": deliverCheckCode})
	if err != nil {
		return nil, err
	}

	gomeResult, err := a.AccessAPI(gomeUrl, CheckOutOrder, 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) OrderAgreeOrRefuseAfterApply(req *AgreeOrRefuseCheck) (*SystemParameterRes, error) {
	byteReq, err := json.Marshal(req)
	if err != nil {
		return nil, err
	}

	gomeResult, err := a.AccessAPI(gomeUrl, CancelAgreeOrRefuseAfterApply, 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
}
