package channel

import (
	"context"
	"git.oa00.com/supply-chain/service/client"
	"github.com/smallnest/rpcx/share"
)

const (
	AfterServiceStatusApply   = 1 // 售后申请中
	AfterServiceStatusDeliver = 2 // 客户发货
	AfterServiceStatusHandle  = 3 // 收货处理中
	AfterServiceStatusFinal   = 4 // 售后完成
	AfterServiceStatusClose   = 5 // 售后关闭
)

type afterService struct {
}
type ArgsAfterServiceCan struct {
	OrderSn string // 订单编号
	SkuId   uint   // skuId
}
type ReplyAfterServiceCan struct {
	CanApply       uint               `json:"canApply"`       // 是否可申请售后 1=可申请 2=不可申请
	SkuId          uint               `json:"skuId"`          // skuId
	AppliedNum     uint               `json:"appliedNum"`     // 已申请售后商品数量
	CannotApplyTip string             `json:"cannotApplyTip"` // 不可申请原因
	Types          []AfterServiceType `json:"types"`
}
type AfterServiceType struct {
	TypeId   string `json:"typeId"`   // 类型
	TypeName string `json:"typeName"` // 类型名称
}

// Can @Title 获取是否可发起售后
func (a *afterService) Can(ctx context.Context, channelId string, args ArgsAfterServiceCan) (reply ReplyAfterServiceCan, err error) {
	xClient, err := client.GetClient(a)
	if err != nil {
		return
	}
	err = xClient.Call(context.WithValue(ctx, share.ReqMetaDataKey, map[string]string{"channelId": channelId}), "Can", args, &reply)
	return
}

type ArgsAfterServiceReason struct {
	OrderSn string // 订单编号
	SkuId   uint   // skuId
	Type    string // 售后类型
}
type ReplyAfterServiceReason struct {
	ReasonCode  string `json:"reasonCode"`  // 售后原因编码
	ReasonName  string `json:"reasonName"`  // 售后原因描述
	NeedPicture uint   `json:"needPicture"` // 是否需要上传图片 1=需要上传 2=不需要上传
}

// Reason @Title 获取售后原因
func (a *afterService) Reason(ctx context.Context, channelId string, args ArgsAfterServiceReason) (reply []ReplyAfterServiceReason, err error) {
	xClient, err := client.GetClient(a)
	if err != nil {
		return
	}
	err = xClient.Call(context.WithValue(ctx, share.ReqMetaDataKey, map[string]string{"channelId": channelId}), "Reason", args, &reply)
	return
}

type ArgsAfterServiceApply struct {
	TypeId                string   // 售后类型
	TypeName              string   // 售后名称
	ReasonCode            string   // 售后原因编码
	ReasonName            string   // 售后原因描述
	ChannelAfterServiceSn string   // 渠道售后单号
	OrderSn               string   // 订单编号
	SkuId                 uint     // skuId
	Pictures              []string // 图片地址数组
	Quantity              uint     // 售后申请数量
}
type ReplyAfterServiceApply struct {
	AfterServiceSn        string `json:"afterServiceSn"`        // 渠道售后单号
	ChannelAfterServiceSn string `json:"channelAfterServiceSn"` // 渠道售后单号
}

// Apply @Title 发起售后
func (a *afterService) Apply(ctx context.Context, channelId string, args ArgsAfterServiceApply) (reply ReplyAfterServiceApply, err error) {
	xClient, err := client.GetClient(a)
	if err != nil {
		return
	}
	err = xClient.Call(context.WithValue(ctx, share.ReqMetaDataKey, map[string]string{"channelId": channelId}), "Apply", args, &reply)
	return
}

type ReplyAfterServiceLogisticsAddress struct {
	Name    string `json:"name"`    // 姓名
	Mobile  string `json:"mobile"`  // 手机号
	ZipCode string `json:"zipCode"` // 邮编
	Address string `json:"address"` // 地址
}

// LogisticsAddress @Title 寄回地址
func (a *afterService) LogisticsAddress(ctx context.Context, channelId string, afterServiceSn string) (reply ReplyAfterServiceLogisticsAddress, err error) {
	xClient, err := client.GetClient(a)
	if err != nil {
		return
	}
	err = xClient.Call(context.WithValue(ctx, share.ReqMetaDataKey, map[string]string{"channelId": channelId}), "LogisticsAddress", afterServiceSn, &reply)
	return
}

type ArgsAfterServiceBackLogisticsBill struct {
	AfterServiceSn   string // 售后单号
	LogisticsCompany string // 物流公司
	WaybillCode      string // 运单号
	SendGoodsDate    int64  // 运单发货日期
}

// BackLogisticsBill @Title 回传物流信息
func (a *afterService) BackLogisticsBill(ctx context.Context, channelId string, args ArgsAfterServiceBackLogisticsBill) (err error) {
	xClient, err := client.GetClient(a)
	if err != nil {
		return
	}
	reply := 0
	err = xClient.Call(context.WithValue(ctx, share.ReqMetaDataKey, map[string]string{"channelId": channelId}), "BackLogisticsBill", args, &reply)
	return
}

// Cancel @Title 取消售后
func (a *afterService) Cancel(ctx context.Context, channelId string, afterServiceSn string) (err error) {
	xClient, err := client.GetClient(a)
	if err != nil {
		return
	}
	reply := 0
	err = xClient.Call(context.WithValue(ctx, share.ReqMetaDataKey, map[string]string{"channelId": channelId}), "Cancel", afterServiceSn, &reply)
	return
}