#ifndef COMMON_STRUCT_H
#define COMMON_STRUCT_H

#include <iostream>
#include <vector>
//商品
struct product
{
    std::string source;                //商品来源
    std::string attributes;            //商品属性
    std::string combo_id;              //商品组合ID
    std::string bom_id;                //商品分组组合ID
    std::string bag_id;                //商品口袋ID
    std::string name;                  //商品名称
    int original_price = 0;            //商品原价
    int price=0;                       //商品价格（折后价）
    int qty=0;                         //商品数量
    std::string sku;                   //商品SKU
};

//商品规格
struct productSpec
{
    std::string name;                  //规格名称
    int price=0;                       //规格价格
    int qty=0;                         //规格数量
    std::string sku;                   //规格SKU
};  

//商品属性
struct productAttr
{
    product pro;                       //商品
    std::vector<productSpec> vecSpec;  //商品规格
};

//付款明细
struct paymentDetail
{
    int amount=0;                     //支付金额  
    int type=0;                       //支付类型
    std::string trans_id;             //支付交易号
    std::string account_id;           //支付账户号
    std::string pay_code;             //支付码
};

//支付信息
struct payment
{
    std::string summary;                    //支付明细汇总 
    std::vector<paymentDetail> vecDetail;   //付款明细数组
};

// //订单积分详情
// struct bonusDetail
// {
//     int type=0;                       //积分类型
//     std::string desc;                 //积分奖励描述
//     int point=0;                      //积分奖励数值
//     std::string sku;                  //积分商品
// };

// //订单积分
// struct bonus
// {
//     std::string summary;                    //积分奖励总和 
//     std::vector<bonusDetail> vecDetail;     //付款明细数组
// };

// //促销明细
// struct promotionsDetail
// {
//     std::string pro_id;               //促销编码
//     int type=0;                       //促销类型
//     std::string desc;                 //促销描述
//     int offer=0;                      //促销金额
//     std::string sku;                  //促销商品
// };

// //促销
// struct promotions
// {
//     std::string summary;                         //促销金额总和 
//     std::vector<promotionsDetail> vecDetail;     //付款明细数组
// };

//响应结果
struct responseRlt
{
    int status_code=0;                //响应状态码
    std::string msg;                  //响应提示信息
};

//门店信息
struct store
{
    std::string store_id;             //门店号
    std::string pos_id;               //订单推送 POS 编号
    std::string vem_id;               //自助终端编号
    std::string vem_shelf;            //自助终端货架号
};

//配送信息
struct delivery
{
    std::string type;                     //配送类型
    int status=0;                         //配送状态
    std::string status_desc;              //配送状态描述 
    std::string driver_name;              //外送骑手姓名 
    std::string driver_phone;             //骑手电话 
};

//顾客信息
struct customer
{                        
    std::string name;                     //顾客姓名 
    std::string phone;                    //顾客电话
    std::string address;                  //顾客地址
    std::string account;                  //顾客账号
    int account_type=0;                   //顾客账号类型
    std::string account_level;            //顾客账号等级 
    std::string card_no;                  //纳客宝卡号
};

//促销
struct promotions
{
    std::string pcode;               //优惠码
    std::string proType;             //类型： 00快速积点 ，20售价促销，30进价+售价促销，40组合促销，50整单促销，60厂区促销，70会员卡充值促销, 80电子点标
    std::string type;                //优惠子类型
    std::string desc;                //优惠明细
    std::string name;                //名称
    std::string sku;                 //商品编号
    int originalPrice=0;             //原始价格
    int discount=0;                  //折扣
    int promotionPrice=0;             //优惠价格
    std::string giftSku;             //赠品的编码
    int giftQty=0;                   //赠品的数量
};

//积分
struct bonus
{
    std::string pcode;               //优惠码
    std::string proType;             //类型： 00快速积点 ，20售价促销，30进价+售价促销，40组合促销，50整单促销，60厂区促销，70会员卡充值促销, 80电子点标
    std::string type;                //优惠子类型
    std::string desc;                //优惠明细
    std::string name;                //名称
    std::string sku;                 //商品编号
    int bonusNum=0;                     //获得积分
};

//电子点标
struct ecoupon
{
    std::string pcode;               //优惠码
    std::string proType;             //类型： 00快速积点 ，20售价促销，30进价+售价促销，40组合促销，50整单促销，60厂区促销，70会员卡充值促销, 80电子点标
    std::string type;                //优惠子类型
    std::string desc;                //优惠明细
    std::string name;                //名称
    std::string sku;                 //商品编号
    std::string ecouponNumber;       //电子点标号码
    int ecouponQty=0;                //电子点标数量
};

//订单结构体
struct orderObj
{
    int fm_cmd=0;                                     //请求类型
    std::string channel;                              //订单渠道   
    bool offline_bonus=false;                         //是否需要线下累分
    int order_no=0;                                   //订单序号
    std::string order_id;                             //订单标识号
    std::string create_time;                          //订单创建时间
    std::string delivery_time;                        //订单期望送达时间
    int status=0;                                     //订单状态
    int ods_status=0;                                 //ods订单状态
    std::string status_desc;                          //订单状态描述
    std::string remark;                               //订单备注
    int total_price=0;                                //订单总价
    int delivery_price=0;                             //配送费
    int reduced_price=0;                              //折扣总金额 
    int wmDiscount=0;                                 //外卖优惠金额 
    int wmPtSharedDiscount=0;                         //外卖平台承担的优惠金额 
    int wmSjSharedDiscount=0;                         //外卖商家承担的优惠金额 
    std::string pickup_code;                          //自取订单取餐码
    std::string pickup_point;                         //自取订单取餐处 
    std::string invoice_pickup_code;                  //订单发票提出码
    
    store storeInfo;                                  //门店信息 
    delivery deliveryInfo;                            //配送信息
    customer customerInfo;                            //顾客信息
    std::vector<productAttr> vecProducts;             //商品列表
    payment payInfo;                                  //付款明细
    std::vector<bonus> vecBonus;                      //消费积分
    std::vector<promotions> vecPromotions;             //促销列表
    std::vector<ecoupon> vecEcoupon;                   //电子点标
};

//订单状态
struct orderStatusObj
{
    int fm_cmd=0;                      //请求类型 
    std::string order_id;              //订单编号
    int order_status=0;                //订单状态
    int delivery_status=0;             //配送状态
};

struct refundObj
{
    int fm_cmd=0;                            //请求类型(1003) 
    std::string channel;                     //订单渠道 
    std::string order_id;                    //订单编号 
    int refund_amount=0;                     //退款总金额 
    std::vector<productAttr> vecProducts;    //商品数组
};

//预警商品
struct productWarn
{
    std::string source;                //商品来源
    std::string attributes;            //商品属性
    std::string combo_id;              //商品组合ID
    std::string bom_id;                //商品分组组合ID
    std::string bag_id;                //商品口袋ID
    std::string name;                  //商品名称
    int price=0;                       //商品价格
    std::string sku;                   //商品SKU
    int stock=0;                       //商品当前库存
    int safeQty=0;                     //商品安全库存
    std::string alertTime;             //预警时间
};

//库存预警
struct stockWarnObj
{
    int fm_cmd=0;                                //请求类型(1006) 
    std::string alertTime;                       //时间戳
    std::vector<productWarn> vecProducts;        //商品数组
};

//POS订单处理请求
struct orderOperationObj
{
    int fm_cmd=0;                        //请求类型 •1011 确认接单    •1012 拒绝接单
    std::string store_id;                //门店号
    std::string channel;                 //渠道
    std::string order_id;                //订单编号
    std::string comment;                 //操作原因描述
};

//服务端返回值（POS订单处理请求）
struct serverResponseOperationObj
{
    std::string code;
    std::string message;
    std::string ver;
};

//订单发送给pos失败结构体
struct orderSendFailedObj
{
    int64_t timestamp=0;         //接收到订单时候的时间戳(精确到毫秒)
    std::string order_json;      //订单json字符串
};

#endif