/*
 * Copyright 2014 Google Inc.
 *
 * Use of this source code is governed by a BSD-style license that can be
 * found in the LICENSE file.
 */

#ifndef DMJsonWriter_DEFINED
#define DMJsonWriter_DEFINED

#include "CommandLineFlags.h"
#include "SkString.h"

namespace DM {

/**
 *  Class for collecting results from DM and writing to a json file.
 *  All methods are thread-safe.
 */
class JsonWriter {
public:
    /**
     *  Info describing a single run.
     */
    struct BitmapResult {
        SkString name;            // E.g. "ninepatch-stretch", "desk_gws.skp"
        SkString config;          //      "gpu", "8888", "serialize", "pipe"
        SkString sourceType;      //      "gm", "skp", "image"
        SkString sourceOptions;   //      "image", "codec", "subset", "scanline"
        SkString md5;             // In ASCII, so 32 bytes long.
        SkString ext;             // Extension of file we wrote: "png", "pdf", ...
        SkString gamut;
        SkString transferFn;
        SkString colorType;
        SkString alphaType;
        SkString colorDepth;
    };

    /**
     *  Add a result to the end of the list of results.
     */
    static void AddBitmapResult(const BitmapResult&);

    /**
     *  Write all collected results to the file dir/dm.json.
     */
    static void DumpJson(const char* dir,
                         CommandLineFlags::StringArray key,
                         CommandLineFlags::StringArray properties);

    /**
     * Read JSON file at path written by DumpJson, calling callback for each
     * BitmapResult recorded in the file.  Return success.
     */
    static bool ReadJson(const char* path, void(*callback)(BitmapResult));
};


} // namespace DM
#endif // DMJsonWriter_DEFINED
