package tm

import (
	"context"
	"encoding/json"
	link "github.com/alibabacloud-go/linkedmall-20220531/v2/client"
	"github.com/alibabacloud-go/tea/tea"
	"github.com/gogf/gf/encoding/gjson"
	"github.com/gogf/gf/frame/g"
)

type orderTm struct {
}

var Order = orderTm{}

type OrderAddress struct {
	AddressDetail string `json:"AddressDetail"`
	DivisionCode  string `json:"DivisionCode"`
	FullName      string `json:"FullName"`
	Mobile        string `json:"Mobile"`
	TownDivisionCode string `json:"TownDivisionCode"`
}
type RenderDistributionOrderReq struct {
	ItemInfoLists []*ItemInfo `json:"ItemInfoLists"`
	BuyerId string `json:"BuyerId"`
	Addr string `json:"Addr"`
}
type ItemInfo struct{
	DistributionMallId string `json:"DistributionMallId,omitempty" xml:"DistributionMallId,omitempty"`
	LmItemId           string `json:"LmItemId,omitempty" xml:"LmItemId,omitempty"`
	Quantity           int32  `json:"Quantity,omitempty" xml:"Quantity,omitempty"`
	SkuId              string `json:"SkuId,omitempty" xml:"SkuId,omitempty"`
}
type RenderDistributionOrderRes struct {
	Code    string `json:" Code"`
	Message string `json:"Message"`
	Model   struct {
		AddressInfos []struct {
			AddressDetail    string `json:"AddressDetail"`
			AddressId        int64  `json:"AddressId"`
			DivisionCode     string `json:"DivisionCode"`
			Receiver         string `json:"Receiver"`
			ReceiveRPhone    string `json:"Receive rPhone"`
			TownDivisionCode string `json:"TownDivisionCode"`
		} `json:"AddressInfos"`
		CanSell          bool `json:"CanSell"`
		RenderOrderInfos []struct {
			CanSell       bool `json:"CanSell"`
			DeliveryInfos []struct {
				DisplayName string `json:"DisplayName"`
				Id          string `json:"Id"`
				PostFee     int    `json:"PostFee"`
				ServiceType int    `json:"ServiceType"`
			} `json:"DeliveryInfos"`
			InvoiceInfo struct {
			} `json:"InvoiceInfo"`
			ItemInfos []struct {
				CanSell            bool   `json:"CanSell"`
				DistributionMallId string `json:"DistributionMallId"`
				Features           struct {
					DeliveryVersion string `json:"delivery_version"`
					ExTraPeriod     string `json:"ex traPeriod"`
					TaxInvoice      string `json:"tax_invoice"`
				} `json:"Features"`
				ItemId     string `json:"ItemId"`
				ItemName   string `json:"ItemName"`
				ItemPicUrl string `json:"ItemPicUrl"`
				Price      int    `json:"Price"`
				Quantity   int    `json:"Quantity"`
				SkuId      int64  `json:"SkuId"`
				SkuName    string `json:"SkuName"`
			} `json:"ItemInfos"`
		} `json:"RenderOrderInfos"`
	} `json:"Model"`
	RequestId string `json:"RequestId"`
	Success   bool   `json:"Success"`
}
type OrderCreateReq struct {
	UserId       string
	ChannelOrder string
	Address      OrderAddress
	ItemLists    []OrderGoodsItem
}
type OrderGoodsItem struct {
	LmItemId   string `json:"LmItemId"`
	Quantity string `json:"Quantity"`
	SkuId    string `json:"SkuId"`
	DistributionMallId string `json:"DistributionMallId"`

}
type OrderCreateRes struct {
	RequestId string `json:"RequestId"`
	Message   string `json:"Message"`
	Model     string `json:"Model"`
	Code      string `json:"Code"`
	Success   bool   `json:"Success"`
}
type OrderFilter struct {
	DistributionTradeId     string `json:"DistributionTradeId,omitempty"`
	OrderList    []string `json:"OrderList,omitempty"`
	LogisticsStatus string   `json:"LogisticsStatus,omitempty"`
	OrderStatus     string   `json:"OrderStatus,omitempty"`
}
type T struct {
	CreateDate          string `json:"createDate"`
	DistributionOrderId string `json:"distributionOrderId"`
	DistributorId       string `json:"distributorId"`
	LogisticsStatus     string `json:"logisticsStatus"`
	OrderAmount         string `json:"orderAmount"`
	OrderStatus         string `json:"orderStatus"`
	SubOrderList        []struct {
		ItemId    string `json:"itemId"`
		ItemPic   string `json:"itemPic"`
		ItemPrice []struct {
			FundAmountMoney string `json:"fundAmountMoney"`
		} `json:"itemPrice"`
		ItemTitle               string `json:"itemTitle"`
		Number                  string `json:"number"`
		SkuId                   string `json:"skuId"`
		SkuName                 string `json:"skuName"`
		OrderStatus             string `json:"orderStatus"`
		LogisticsStatus         string `json:"logisticsStatus"`
		SubDistributionOrderId  string `json:"subDistributionOrderId"`
		MainDistributionOrderId string `json:"mainDistributionOrderId"`
	} `json:"subOrderList"`
}
type OrderListRes struct {
	RequestId   string `json:"RequestId"`
	Message     string `json:"Message"`
	PageSize    int    `json:"PageSize"`
	PageNumber  int    `json:"PageNumber"`
	Code string `json:"Code"`
	Model []struct{
		CreateDate          string `json:"CreateDate"`
		DistributionOrderId string `json:"DistributionOrderId"`
		DistributorId       string `json:"DistributorId"`
		LogisticsStatus     string `json:"LogisticsStatus"`
		OrderAmount         string `json:"OrderAmount"`
		OrderStatus         string `json:"OrderStatus"`
		SubOrderList        []struct {
			ItemId    string `json:"ItemId"`
			ItemPic   string `json:"ItemPic"`
			ItemPrice []struct {
				FundAmountMoney string `json:"FundAmountMoney"`
			} `json:"ItemPrice"`
			ItemTitle               string `json:"ItemTitle"`
			Number                  string `json:"Number"`
			SkuId                   string `json:"SkuId"`
			SkuName                 string `json:"SkuName"`
			OrderStatus             string `json:"OrderStatus"`
			LogisticsStatus         string `json:"LogisticsStatus"`
			SubDistributionOrderId  string `json:"SubDistributionOrderId"`
			MainDistributionOrderId string `json:"MainDistributionOrderId"`
		} `json:"SubOrderList"`
	}
}

type OrderListReq struct {
	DistributorId       string `json:"DistributorId"`
	FilterOption        struct{
		DistributionTradeId string `json:"DistributionTradeId"`
		OrderList       []string `json:"OrderList"`
	}   `json:"FilterOption"`
	PageNumber       int32 `json:"PageNumber"`
	PageSize int32 `json:"PageSize"`
	LogisticsStatus string `json:"LogisticsStatus"`
	OrderStatus     string `json:"OrderStatus"`

}
type FilterOption struct {

}
type OrderInfoReq struct {
	MainDistributionOrderId       string `json:"MainDistributionOrderId"`
	UserId          string `json:"UserId"`
	LmOrderId       string `json:"LmOrderId"`
	LogisticsStatus string `json:"LogisticsStatus"`
	OrderStatus     string `json:"OrderStatus"`
}
type OrderInfoRes struct {
	RequestId   string `json:"RequestId"`
	Message     string `json:"Message"`
	Code string `json:"Code"`
	Model struct{
		CreateDate          string `json:"CreateDate"`
		DistributionOrderId string `json:"DistributionOrderId"`
		DistributorId       string `json:"DistributorId"`
		LogisticsStatus     string `json:"LogisticsStatus"`
		OrderAmount         string `json:"OrderAmount"`
		OrderStatus         string `json:"OrderStatus"`
		SubOrderList        []struct {
			ItemId    string `json:"ItemId"`
			ItemPic   string `json:"ItemPic"`
			ItemPrice []struct {
				FundAmountMoney string `json:"FundAmountMoney"`
			} `json:"ItemPrice"`
			ItemTitle               string `json:"ItemTitle"`
			Number                  string `json:"Number"`
			SkuId                   string `json:"SkuId"`
			SkuName                 string `json:"SkuName"`
			OrderStatus             string `json:"OrderStatus"`
			LogisticsStatus         string `json:"LogisticsStatus"`
			SubDistributionOrderId  string `json:"SubDistributionOrderId"`
			MainDistributionOrderId string `json:"MainDistributionOrderId"`
		} `json:"SubOrderList"`
	} `json:"Model"`
}
type OrderStatusReq struct {
	DistributionTradeId string `json:"DistributionTradeId"`
}
type OrderStatusRes struct {
	RequestId   string `json:"RequestId"`
	Message     string `json:"Message"`
	Code string `json:"Code"`
	Model string `json:"Model"`
	//1:分销单创建中
	//
	//10:采购中
	//
	//20:采购成功,待发货
	//
	//21:采购成功,部分发货
	//
	//22:采购成功,全部发货
	//
	//30:部分采购成功,待发货
	//
	//31:部分采购成功,部分发货
	//
	//32:部分采购成功,全部发货
	//
	//80:交易失败
	//
	//81:采购失败
	//
	//99:交易成功
}
//Before 验证订单商品
func (s *orderTm) Before(ctx context.Context,itemInfo *RenderDistributionOrderReq) (res *RenderDistributionOrderRes, err error) {
	client,err :=initClient()
	if err!=nil{
		return
	}
	if client==nil{
		return
	}
	if itemInfo==nil{
		return
	}
	var itemInfoLists []*link.RenderDistributionOrderRequestItemInfoLists
	err =gjson.New(itemInfo.ItemInfoLists).Scan(&itemInfoLists)

	result ,err :=client.RenderDistributionOrder(&link.RenderDistributionOrderRequest{
		BuyerId: tea.String(itemInfo.BuyerId),
		DistributorId:      tea.String(server.DistributorId),
		ItemInfoLists:          itemInfoLists,
		TenantId:           tea.String(server.TenantId),
		DeliveryAddress: tea.String(gjson.New(itemInfo.Addr).MustToJsonString()),
      	DistributionSupplierId: tea.String(server.DistributionSupplierId),
	})
	if err!=nil{
		return
	}

	if result==nil{
		return
	}
	_ = gjson.NewWithOptions(result.Body, gjson.Options{
		StrNumber: true,
	}).Scan(&res)
	return
}
//订单列表
func (s *orderTm) List(ctx context.Context,item *OrderListReq) (res *OrderListRes, err error) {
	client,err :=initClient()
	if err!=nil{
		return
	}
	if client==nil{
		return
	}

	result ,err :=client.QueryOrderList4Distribution(&link.QueryOrderList4DistributionRequest{
		DistributorId: tea.String(server.DistributorId),
		FilterOption:  tea.String(gjson.New(item.FilterOption).MustToJsonString()),
		PageNumber:    tea.Int32(item.PageNumber),
		PageSize:      tea.Int32(item.PageSize),
		TenantId:      tea.String(server.TenantId),
	})
	if err!=nil{
		return
	}

	if result==nil{
		return
	}
	a,_ :=json.Marshal(result.Body)
	if err := json.Unmarshal([]byte(a), &res); err != nil {
		panic(err)
	}
	return
}
//创建订单
func (s *orderTm) Create(ctx context.Context,item *OrderCreateReq) (res *OrderCreateRes, err error) {
	client,err :=initClient()
	if err!=nil{
		return
	}
	if client==nil{
		return
	}
	if item==nil{
		return
	}
	var itemInfoLists []*link.ApplyCreateDistributionOrderRequestItemInfoLists
	err =gjson.New(item.ItemLists).Scan(&itemInfoLists)

	result ,err :=client.ApplyCreateDistributionOrder(&link.ApplyCreateDistributionOrderRequest{
		DistributorId: tea.String(server.DistributorId),
		TenantId:      tea.String(server.TenantId),
		DistributionSupplierId:      tea.String(server.DistributionSupplierId),
		BuyerId:      tea.String(item.UserId),
		ItemInfoLists:      itemInfoLists,
		DeliveryAddress:      tea.String(gjson.New(item.Address).MustToJsonString()),
	})
	if err!=nil{
		return
	}

	if result==nil{
		return
	}

	err =gjson.New(result.Body).Scan(&res)
	return
}
//订单详情
func (s *orderTm) Detail(ctx context.Context,item *OrderInfoReq) (res *OrderInfoRes, err error) {
	client,err :=initClient()
	if err!=nil{
		return
	}
	if client==nil{
		return
	}
	g.Dump(item.MainDistributionOrderId,"item.MainDistributionOrderId")
	result ,err :=client.QueryOrderDetail4Distribution(&link.QueryOrderDetail4DistributionRequest{
		DistributorId: tea.String(server.DistributorId),
		MainDistributionOrderId: tea.String(item.MainDistributionOrderId),
		TenantId:      tea.String(server.TenantId),
	})
	if err!=nil{
		return
	}

	if result==nil{
		return
	}

	err =gjson.New(result.Body).Scan(&res)

	return
}
//订单交易状态
func (s *orderTm) Status(ctx context.Context,item *OrderStatusReq) (res *OrderStatusRes, err error) {
	client,err :=initClient()
	if err!=nil{
		return
	}
	if client==nil{
		return
	}
	result ,err :=client.QueryDistributionTradeStatus(&link.QueryDistributionTradeStatusRequest{
		DistributorId: tea.String(server.DistributorId),
		DistributionTradeId: tea.String(item.DistributionTradeId),
		TenantId:      tea.String(server.TenantId),
		DistributionSupplierId: tea.String(server.DistributionSupplierId),
	})
	if err!=nil{
		return
	}

	if result==nil{
		return
	}
	err =gjson.New(result.Body).Scan(&res)


	return
}
//订单详情
//func (s *orderTm) Detail(ctx context.Context,req OrderInfoReq) (res OrderInfoRes,err error) {
//
//	method := "QueryOrderDetail4Distribution"
//
//
//	request := map[string]string{
//		"DistributorId" : server.DistributorId,
//		"MainDistributionOrderId" :req.MainDistributionOrderId,
//	}
//
//	result, err := post(ctx, method, request)
//	g.Dump(result,"resuelet--------")
//	//_ = json.Unmarshal([]byte(result), &res)
//	return
//}
//Before 验证订单商品 todo 该接口正确通过,由于订单部分接口不通过天猫技术不支持对接,后续有时间再自己写
//func (s *orderTm) RenderDistributionOrder(ctx context.Context, addr OrderAddress, itemInfo *RenderDistributionOrderReq) (res *RenderDistributionOrderRes, err error) {
//	method := "RenderDistributionOrder"
//	fmt.Println(1)
//	request := g.MapStrStr{
//		//"ItemInfoLists" :gjson.New(itemInfo.ItemInfoLists).MustToJsonString(),
//		//		"ItemInfoLists":fmt.Sprintf(`{
//		// "lmItemId" : "10027642-706637605402",
//		// "distributionMallId":"9e7b3e4ba5e24dd49b89498f09d05cf1",
//		// "skuId" : "46059969",
//		// "quantity": 1
//		//}`),
//		"DeliveryAddress":        gjson.New(addr).MustToJsonString(),
//		"BuyerId":                itemInfo.BuyerId,
//		"TenantId":               server.TenantId,
//		"DistributorId":          server.DistributorId,
//		"DistributionSupplierId": server.DistributionSupplierId,
//	}
//	g.Dump("request=====", request)
//
//	result, err := post(ctx, method, request)
//	err = gjson.New(result).Scan(&res)
//	return
//}
//Create 下单接口
//func (s *orderTm) Create(ctx context.Context, req OrderCreateReq) (res *OrderCreateRes, err error) {
//	method := "ApplyCreateDistributionOrder"
//	g.Dump("req.ItemLists=====",req.ItemLists)
//	request := convert("ItemInfoLists", gconv.Maps(req.ItemLists))
//	request["DeliveryAddress"] = gjson.New(req.Address).MustToJsonString()
//	request["TenantId"] = server.TenantId
//	request["DistributorId"] = server.DistributorId
//	request["BuyerId"] = req.UserId
//	request["DistributionSupplierId"] = server.DistributionSupplierId
//	request["DistributionOutTradeId"] = req.ChannelOrder
//	result, err := post(ctx, method, request)
//	err =gjson.New(result).Scan(&res)
//	return
//}



//
//type OrderListReq struct {
//	UserId          string
//	ChannelOrder    string
//	LmOrderId       string
//	LogisticsStatus string
//	OrderStatus     string
//}
//


//List 列表
//func (s *orderTm) QueryOrderList4Distribution(ctx context.Context,req OrderListReq) (res OrderListRes,err error) {
//	method := "QueryOrderList4Distribution"
//
//	var filterOption = OrderFilter{
//		LogisticsStatus: "1",
//		OrderStatus:     req.OrderStatus,
//	}
//	//if req.LmOrderId != "" {
//	//	filterOption.LmOrderList = garray.NewStrArray().Append(req.LmOrderId).Slice()
//	//}
//	//if req.ChannelOrder != "" {
//	//	filterOption.ChannelOrder = garray.NewStrArray().Append(req.ChannelOrder).Slice()
//	//
//	//}
//
//	request := map[string]string{
//		"FilterOption":     gjson.New(filterOption).MustToJsonString(),
//		"PageNumber":       "1",
//		"PageSize":         "20",
//		"DistributorId" : server.DistributorId,
//		"TenantId" :server.TenantId,
//
//	}
//
//	result, err := post(ctx, method, request)
//	g.Dump(result,"resuelet--------")
//	//_ = json.Unmarshal([]byte(result), &res)
//	return
//}

//type OrderCancelReq struct {
//	UserId    string
//	LmOrderId string
//}
//