#ifndef PACKINFO_H
#define PACKINFO_H

#include "QJsonArray"
#include "projectinfo.h"
#include <QSharedPointer>
#include <QString>

QString getDecimalbit(double v, int i = 2);

class PackInfo;

struct RuKuInfo
{
    int warehouse_id;
    int way;
    QJsonArray product_details;
    int product_id;
    QString remark;

    QJsonObject toObject();
};

struct BoxInfo
{
    inline QSharedPointer<PackInfo> parentPack() { return parent.toStrongRef(); }

    inline QString caseNumber() { return case_number; }

    int box_weight = 0;    //	是	int	皮重 单位:克
    int tube_number = 0;   //	是	int	筒数
    int bucket_weight = 0; //	是	int	总筒重 单位:克
    int gross_weight = 0;  //	是	int	毛重 单位:克
    int net_weight = 0;    //	是	int	净重 单位:克
    QString Level;         //等级;
    QString twist_type;    //	string	捻向
    QString bucket_color;  //	string	管色
    QString sort;          //	是	string	排序
    QString remark;        //	否	string	备注

    QJsonObject toObject();

    static QSharedPointer<BoxInfo> fromObject(QSharedPointer<PackInfo> &pack, QJsonObject &obj);
    BoxInfo(QSharedPointer<PackInfo> pack, QString code);

private:
    QString case_number; //	是	string	箱号
    QWeakPointer<PackInfo> parent;
    friend class PackInfo;
};

Q_DECLARE_METATYPE(QSharedPointer<BoxInfo>);

class PackInfo : public QEnableSharedFromThis<PackInfo>
{
public:
    PackInfo(const QSharedPointer<ProjectInfo> &info);

    int quantity = 0; //	是	int	箱数
    int level_id = 0; //	是	int	等级ID
    QString level;
    QString machine_no;   //	是	string	机台
    QString packing_time; //	是	string	打包时间
    QString packing_type; //	是	string	打包类型
    QString carton_type;  //	是	string	纸箱
    QString operator_id;  //	是	int	操作员ID
    QString batch_no;     //批号
    bool autoRuku;        //    打包及入库是否点击
    int warehouse_id = 0; //仓库id

    QString remark; //	否	string

    QString telephone; // 公司
    QString customer;  // 抬头
    QString address;

    int packType; // 0 定重，1 不定重

    inline const QList<QSharedPointer<BoxInfo>> &boxes() const { return _boxes; } // array	成品详情
    inline const QSharedPointer<ProjectInfo> &info() const { return _info; }
    inline QString codeSingle() const { return code_single; } // string	码单

    int tube_number();  // int	筒数
    int gross_weight(); // 	毛重 单位:克
    int net_weight(); //单位:克
    int goodsID() { return goods_id; }

    inline qint64 time() { return _time; }

    QSharedPointer<BoxInfo> addBoxInfo();
    void addBoxInfoList(QSharedPointer<BoxInfo> boxes);
    void delBoxInfoAt(int num);
    QSharedPointer<BoxInfo> boxInfoAt(int num);
    int boxInfoSize();

    void upInfo(const QSharedPointer<ProjectInfo> &info)
    {
        _info = info;
        if (!info.isNull())
            goods_id = info->goods_id;
    }

    QJsonObject toObject();

    static QSharedPointer<PackInfo> fromObject(QJsonObject &obj);

private:
    QString buildPackId();
    QString buildBoxId();

private:
    QList<QSharedPointer<BoxInfo>> _boxes;
    QSharedPointer<ProjectInfo> _info;
    QString code_single;
    int goods_id;
    qint64 _time;
    int _boxIndex;
    static int lastMin;
    static int lastNum;
};

Q_DECLARE_METATYPE(QSharedPointer<PackInfo>);

#endif // PACKINFO_H
