#ifndef FILETASK_H
#define FILETASK_H


#include "content.h"
#include <memory>
#include <functional>
#include "fellow.h"
using namespace std;

enum class FileTaskType{
    Download,
    Upload
};

enum class FileTaskState{
    NotStart,
    Running,
    Finish,
    Error,
    Canceled
};

class FileTask;
class IFileTaskObserver
{
public:
    virtual void onStateChanged(FileTask* fileTask) = 0;
    virtual void onProgress(FileTask* fileTask) = 0;
};

class FileTask
{
public:
    FileTask();
    FileTask(shared_ptr<FileContent> fileContent, FileTaskType type);
    void setObserver(IFileTaskObserver* observer);
public:
    void setProcess(int val);
    void setState(FileTaskState val, const string& msg="");
    void setFellow(shared_ptr<Fellow> fellow);
    void cancel();
    bool hasCancelPending();
public:
    shared_ptr<Fellow> fellow() const;
    int getProcess() const;
    FileTaskState getState() const;
    string getDetailInfo() const;
    shared_ptr<FileContent> getContent() const;
    FileTaskType type() const;
private:
    shared_ptr<Fellow> mFellow;//要发送给的用户，或文件来自该用户
    int mProcess=0;
    FileTaskState mState = FileTaskState::NotStart;
    shared_ptr<FileContent> mContent;
    IFileTaskObserver* mObserver;
    FileTaskType mType = FileTaskType::Upload;
    string mMsg;
    bool mCancelPending=false;
    int mNotifySize;
    int mLastProcess=0;
};

#endif // FILETASK_H
