//------------------------------------------------------------------------------
/*
    Copyright (c) 2011-2013, OpenCoin, Inc.
*/
//==============================================================================

#ifndef RIPPLE_ILOADFEETRACK_RIPPLEHEADER
#define RIPPLE_ILOADFEETRACK_RIPPLEHEADER

/** Manages the current fee schedule.

    The "base" fee is the cost to send a reference transaction under no load,
    expressed in millionths of one XRP.

    The "load" fee is how much the local server currently charges to send a
    reference transaction. This fee fluctuates based on the load of the
    server.
*/
// VFALCO TODO Rename "load" to "current".
class ILoadFeeTrack
{
public:
    /** Create a new tracker.
    */
    static ILoadFeeTrack* New ();

    virtual ~ILoadFeeTrack () { }

    // Scale from fee units to millionths of a ripple
    virtual uint64 scaleFeeBase (uint64 fee, uint64 baseFee, uint32 referenceFeeUnits) = 0;

    // Scale using load as well as base rate
    virtual uint64 scaleFeeLoad (uint64 fee, uint64 baseFee, uint32 referenceFeeUnits, bool bAdmin) = 0;

    virtual void setRemoteFee (uint32) = 0;

    virtual uint32 getRemoteFee () = 0;
    virtual uint32 getLocalFee () = 0;
    virtual uint32 getClusterFee () = 0;

    virtual uint32 getLoadBase () = 0;
    virtual uint32 getLoadFactor () = 0;

    virtual Json::Value getJson (uint64 baseFee, uint32 referenceFeeUnits) = 0;

    virtual void setClusterFee (uint32) = 0;
    virtual bool raiseLocalFee () = 0;
    virtual bool lowerLocalFee () = 0;
    virtual bool isLoadedLocal () = 0;
    virtual bool isLoadedCluster () = 0;
};

#endif
