package fnpsapi

import (
	"encoding/json"
	"io/ioutil"
	"net/http"
)

const (
	OrderStatus             = "orderStatusNotify"             // 订单状态回调
	AbnormalStatus          = "abnormalReportNotify"          // 异常报备回调
	CookingFinishStatus     = "cookingFinishNotify"           // 商户出餐回调
	ChainstoreStatus        = "chainstoreStatusNotify"        // 门店状态变更回调
	ChainstoreServiceStatus = "chainstoreServiceStatusNotify" // 门店采购服务变更回调
	NoServiceStatus         = "noServiceNotify"               // 城市屏蔽区域调整回调通知
)

var (
	SuccessResponse  = &CallbackResponse{Code: 200}
	SignatureIsNotOk = &CallbackResponse{Code: -1}
)

type CallbackResponse struct {
	Code int `json:"code"`
}

func Err2CallbackResponse(err error, data string) *CallbackResponse {
	if err == nil {
		return SuccessResponse
	}
	return &CallbackResponse{
		Code: -1,
	}
}

type ShortStatus struct {
	AppId        string `json:"app_id"`
	Signature    string `json:"signature"`
	Timestamp    string `json:"timestamp"`
	BusinessData string `json:"business_data"`
}

//#region 订单

// 订单状态
type OrderStatusNottify struct {
	CallbackBusinessType string              `json:"callback_business_type"`
	Param                *OrderCallbackParam `json:"param"`
}

// 订单状态回调paramter
type OrderCallbackParam struct {
	OrderId          int64  `json:"order_id"`           // 订单号
	AppId            string `json:"app_id"`             // 应用id
	PartnerOrderCode string `json:"partner_order_code"` // 外部订单号
	OrderStatus      int    `json:"order_status"`       // 订单状态 订单生成0，运单生成成功1，20：骑手接单，80：骑手到 店，2：配送中，3：已完成，4：已取消，5：配送异常
	//CarrierDriverId    int64  `json:"carrier_driver_id"`    // 骑手id
	CarrierLat         string `json:"carrier_lat"`          // 坐标高德(不要使用)
	CarrierLng         string `json:"carrier_lng"`          // 坐标高德(不要使用)
	CarrierDriverName  string `json:"carrier_driver_name"`  // 骑手姓名
	CarrierDriverPhone string `json:"carrier_driver_phone"` // 骑手电话
	Description        string `json:"description"`          // 描述
	ErrorCode          string `json:"error_code"`           // 异常code
	ErrorScene         string `json:"error_scene"`          // 异常描述
	DetailDescription  string `json:"detail_description"`   // 详情描述
	PushTime           int64  `json:"push_time"`            // 状态推送时间 （毫秒）
	Transfer           int    `json:"transfer"`             // 转单标识 转单标识 1 是转单 0非转单
}

//#endregion
// 门店状态回调
type ChainstoreStatusNotify struct {
	CallbackBusinessType string           `json:"callback_business_type"`
	Param                *ChainstoreParam `json:"param"`
}

// 门店状态回调paramter
type ChainstoreParam struct {
	MerchantId   string `json:"merchant_id"`    // 商户id
	ChainStoreId string `json:"chain_store_id"` // 蜂鸟门店id
	OutShopCode  string `json:"out_shop_code"`  // 外部门店编码
	Status       string `json:"status"`         // 门店认证状态
	ModifyStatus string `json:"modify_status"`  // 门店修改状态
	Remark       string `json:"remark"`         // 门店认证、修改等驳回时返回原因
}

// 出餐回调
type CookingFinishNotify struct {
	OrderId           int64  `json:"order_id"`            // 订单号
	AppId             string `json:"app_id"`              // 应用id
	PartnerOrderCode  string `json:"partner_order_code"`  // 外部订单号
	ChainStoreId      string `json:"chain_store_id"`      // 蜂鸟门店id
	MerchantId        string `json:"merchant_id"`         // 商户id
	CookingFinishTime int64  `json:"cooking_finish_time"` // 状态推送时间 （毫秒）
}

//  异常状态回掉
type AbnormalStatusNotify struct {
	CallbackBusinessType string                `json:"callback_business_type"`
	Param                *AbnormalReportNotify `json:"param"`
}

// 异常状态回调
type AbnormalReportNotify struct {
	OrderId            int64  `json:"order_id"`             // 订单号
	AppId              string `json:"app_id"`               // 应用id
	PartnerOrderCode   string `json:"partner_order_code"`   // 外部订单号
	CarrierDriverId    int64  `json:"carrier_driver_id"`    // 骑手id
	Longitude          string `json:"longitude"`            // 纬度
	Latitude           string `json:"latitude"`             // 门店纬度
	AbnormalCode       string `json:"abnormal_code"`        // 异常报备code
	AbnormalDesc       string `json:"abnormal_desc"`        // 异常报备描述
	AbnormalReportTime int64  `json:"abnormal_report_time"` // 异常报备时间 毫秒

}

// 获取门店状态回调消息
func (a *API) GetChainstoreStatusNotify(request *http.Request) (shopStatusMsg *ChainstoreStatusNotify, storeNotify *ShortStatus, callbackResponse *CallbackResponse) {
	data, err := ioutil.ReadAll(request.Body)
	if err != nil {
		callbackResponse = &CallbackResponse{Code: -1}
		return nil, nil, callbackResponse
	}

	storeNotify = &ShortStatus{}
	if err := json.Unmarshal(data, &storeNotify); err != nil {
		callbackResponse = &CallbackResponse{Code: -1}
		return nil, nil, callbackResponse
	}

	fnNotify := &ChainstoreStatusNotify{}
	if err := json.Unmarshal([]byte(storeNotify.BusinessData), fnNotify); err != nil {
		callbackResponse = &CallbackResponse{Code: -1}
		return nil, nil, callbackResponse
	}

	return fnNotify, storeNotify, SuccessResponse
}

// 获取订单状态回调消息
func (a *API) GetChainOrderStatusNotify(request *http.Request) (shopStatusMsg *OrderStatusNottify, result *ShortStatus, callbackResponse *CallbackResponse) {
	data, err := ioutil.ReadAll(request.Body)
	if err != nil {
		callbackResponse = &CallbackResponse{Code: -1}
		return nil, nil, callbackResponse
	}

	if err := json.Unmarshal(data, &result); err != nil {
		callbackResponse = &CallbackResponse{Code: -1}
		return nil, nil, callbackResponse
	}

	orderResult := &OrderStatusNottify{}
	if err := json.Unmarshal([]byte(result.BusinessData), orderResult); err != nil {
		callbackResponse = &CallbackResponse{Code: -1}
		return nil, nil, callbackResponse
	}
	return orderResult, result, SuccessResponse
}

// 异常配送
func (a *API) GetChainAbnormaltatusNotify(request *http.Request) (shopStatusMsg *AbnormalStatusNotify, storeNotify *ShortStatus, callbackResponse *CallbackResponse) {
	data, err := ioutil.ReadAll(request.Body)
	if err != nil {
		callbackResponse = &CallbackResponse{Code: -1}
		return nil, nil, callbackResponse
	}

	storeNotify = &ShortStatus{}
	if err := json.Unmarshal(data, &storeNotify); err != nil {
		callbackResponse = &CallbackResponse{Code: -1}
		return nil, nil, callbackResponse
	}

	fnNotify := &AbnormalStatusNotify{}
	if err := json.Unmarshal([]byte(storeNotify.BusinessData), fnNotify); err != nil {
		callbackResponse = &CallbackResponse{Code: -1}
		return nil, nil, callbackResponse
	}

	return fnNotify, storeNotify, SuccessResponse
}

func (a *API) CheckCallbackValidation(request *http.Request) (callbackResponse *CallbackResponse) {
	err := request.ParseForm()
	if err != nil {
		callbackResponse = Err2CallbackResponse(err, "")
	}
	return callbackResponse
}
