/*
 * Copyright 2009- ECMWF.
 *
 * This software is licensed under the terms of the Apache Licence version 2.0
 * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
 * In applying this licence, ECMWF does not waive the privileges and immunities
 * granted to it by virtue of its status as an intergovernmental organisation
 * nor does it submit to any jurisdiction.
 */

#ifndef ecflow_viewer_GenFileProvider_HPP
#define ecflow_viewer_GenFileProvider_HPP

#include <string>
#include <vector>

#include "FetchTask.hpp"

class GenFileReceiver;
class VReply;

class GenFileProvider : public FetchQueueOwner {
public:
    explicit GenFileProvider(GenFileReceiver*);
    ~GenFileProvider();
    GenFileProvider(const GenFileProvider&)            = delete;
    GenFileProvider& operator=(const GenFileProvider&) = delete;

    void clear() override;

    virtual void fetchFile(const std::string&);
    virtual void fetchFiles(const std::vector<std::string>&);
    const std::vector<std::string>& filesToFetch() const { return filesToFetch_; }
    VReply* theReply() const override { return reply_; }
    void fetchQueueSucceeded() override;
    void fetchQueueFinished(const std::string& filePath, VNode*) override;

protected:
    VReply* reply_{nullptr};
    GenFileReceiver* provider_{nullptr};
    std::vector<std::string> filesToFetch_;
};

class GenFileReceiver {
public:
    GenFileReceiver();
    virtual ~GenFileReceiver();
    GenFileReceiver(const GenFileReceiver&)            = delete;
    GenFileReceiver& operator=(const GenFileReceiver&) = delete;

    virtual void fileFetchFinished(VReply*) = 0;
    virtual void fileFetchFailed(VReply*)   = 0;

protected:
    GenFileProvider* fetchManager_{nullptr};
};

#endif /* ecflow_viewer_GenFileProvider_HPP */
