#pragma once

#include <xrpld/app/ledger/LedgerMaster.h>
#include <xrpld/app/misc/TxQ.h>
#include <xrpld/rpc/Context.h>

#include <xrpl/basics/chrono.h>
#include <xrpl/ledger/Ledger.h>
#include <xrpl/protocol/serialize.h>

namespace xrpl {

struct LedgerFill
{
    LedgerFill(
        ReadView const& l,
        RPC::Context const* ctx,
        int o = 0,
        std::vector<TxQ::TxDetails> q = {})
        : ledger(l), options(o), txQueue(std::move(q)), context(ctx)
    {
        if (context)
            closeTime = context->ledgerMaster.getCloseTimeBySeq(ledger.seq());
    }

    enum Options {
        dumpTxrp = 1,
        dumpState = 2,
        expand = 4,
        full = 8,
        binary = 16,
        ownerFunds = 32,
        dumpQueue = 64
    };

    ReadView const& ledger;
    int options;
    std::vector<TxQ::TxDetails> txQueue;
    RPC::Context const* context;
    std::optional<NetClock::time_point> closeTime;
};

/** Given a Ledger and options, fill a Json::Value with a
    description of the ledger.
 */
void
addJson(Json::Value&, LedgerFill const&);

/** Return a new Json::Value representing the ledger with given options.*/
Json::Value
getJson(LedgerFill const&);

/** Copy all the keys and values from one object into another. */
void
copyFrom(Json::Value& to, Json::Value const& from);

}  // namespace xrpl
