/*
 * Copyright (c) 2018-2019 Arm Limited.
 *
 * SPDX-License-Identifier: MIT
 *
 * Permission is hereby granted, free of charge, to any person obtaining a copy
 * of this software and associated documentation files (the "Software"), to
 * deal in the Software without restriction, including without limitation the
 * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
 * sell copies of the Software, and to permit persons to whom the Software is
 * furnished to do so, subject to the following conditions:
 *
 * The above copyright notice and this permission notice shall be included in all
 * copies or substantial portions of the Software.
 *
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
 * SOFTWARE.
 */
#ifndef ARM_COMPUTE_GRAPH_DOTGRAPHPRINTER_H
#define ARM_COMPUTE_GRAPH_DOTGRAPHPRINTER_H

#include "arm_compute/graph/IGraphPrinter.h"

#include "arm_compute/graph/INodeVisitor.h"

#include <string>

namespace arm_compute
{
namespace graph
{
/** Graph printer visitor. */
class DotGraphVisitor final : public DefaultNodeVisitor
{
public:
    /** Default Constructor **/
    DotGraphVisitor() = default;
    /** Returns the output information of the last visited node
     *
     * @return Information of the last visited node
     */
    const std::string &info() const;

    // Reveal parent method
    using DefaultNodeVisitor::visit;

    // Inherited methods overridden
    void visit(ActivationLayerNode &n) override;
    void visit(BatchNormalizationLayerNode &n) override;
    void visit(ConcatenateLayerNode &n) override;
    void visit(ConvolutionLayerNode &n) override;
    void visit(DepthwiseConvolutionLayerNode &n) override;
    void visit(EltwiseLayerNode &n) override;
    void visit(FusedConvolutionBatchNormalizationNode &n) override;
    void visit(FusedDepthwiseConvolutionBatchNormalizationNode &n) override;
    void visit(NormalizationLayerNode &n) override;
    void visit(PoolingLayerNode &n) override;
    void default_visit() override;

private:
    std::string _info{};
};

/** Graph printer interface */
class DotGraphPrinter final : public IGraphPrinter
{
public:
    // Inherited methods overridden
    void print(const Graph &g, std::ostream &os) override;

private:
    /** Print dot graph header
     *
     * @param[in]  g  Graph
     * @param[out] os Output stream to use
     */
    void print_header(const Graph &g, std::ostream &os);
    /** Print dot graph footer
     *
     * @param[in]  g  Graph
     * @param[out] os Output stream to use
     */
    void print_footer(const Graph &g, std::ostream &os);
    /** Prints nodes in dot format
     *
     * @param[in]  g  Graph
     * @param[out] os Output stream to use
     */
    void print_nodes(const Graph &g, std::ostream &os);
    /** Prints edges in dot format
     *
     * @param[in]  g  Graph
     * @param[out] os Output stream to use
     */
    void print_edges(const Graph &g, std::ostream &os);

private:
    DotGraphVisitor _dot_node_visitor = {};
};
} // namespace graph
} // namespace arm_compute
#endif /* ARM_COMPUTE_GRAPH_DOTGRAPHPRINTER_H */
