/*
 * (C) Copyright 1996- 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.
 */

/// @author Tiago Quintino

/// @date Dec 2015

#ifndef metkit_MarsLocation_H
#define metkit_MarsLocation_H


#include "eckit/config/Configuration.h"
#include "metkit/MarsRequest.h"

namespace eckit {
    class JSON;
    class Stream;
}

namespace metkit {

//----------------------------------------------------------------------------------------------------------------------

/// MarsLocation represents a MarsRequest associated with the hostname and port.
/// From this location, the data can be directly retrieved without going through a queueing system.
/// It assumes all the data identified by the request can be got from the same location.
/// This is useful to identify and retrieve data directly from memory.
///
/// If we consider that a MarsRequest is analogue to a URI, then a MarsLocation is an analogue to a URL

class MarsLocation {

public: // methods

// - Constructors

    MarsLocation(const MarsRequest& r, const std::string& hostname, int port);
    MarsLocation(eckit::Stream&);
    MarsLocation(const eckit::Configuration&);

// -- Destructor

    ~MarsLocation();

// -- Operators

    operator eckit::Value() const;

    void json(eckit::JSON&) const;

    const MarsRequest& request() const;

    std::string hostname() const;

    int port() const;


private: // members

    MarsRequest 	request_;
    std::string     hostname_;
    int             port_;

private: // methods

	void print(std::ostream&) const;
    void encode(eckit::Stream&) const;

// -- Class members


    friend std::ostream& operator<<(std::ostream& s, const MarsLocation& r) {
        r.print(s); return s;
    }

    friend eckit::JSON& operator<<(eckit::JSON& s, const MarsLocation& r) {
        r.json(s); return s;
    }

    friend eckit::Stream& operator<<(eckit::Stream& s, const MarsLocation& r) {
        r.encode(s); return s;
    }
};

//----------------------------------------------------------------------------------------------------------------------

} // namespace metkit

#endif
