// Copyright 2021 The Dawn & Tint Authors
//
// Redistribution and use in source and binary forms, with or without
// modification, are permitted provided that the following conditions are met:
//
// 1. Redistributions of source code must retain the above copyright notice, this
//    list of conditions and the following disclaimer.
//
// 2. Redistributions in binary form must reproduce the above copyright notice,
//    this list of conditions and the following disclaimer in the documentation
//    and/or other materials provided with the distribution.
//
// 3. Neither the name of the copyright holder nor the names of its
//    contributors may be used to endorse or promote products derived from
//    this software without specific prior written permission.
//
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
// FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
// DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
// OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

#include "src/tint/lang/spirv/reader/ast_parser/helper_test.h"
#include "src/tint/lang/wgsl/writer/ast_printer/ast_printer.h"
#include "src/tint/utils/rtti/switch.h"
#include "src/tint/utils/text/string_stream.h"

#include "gmock/gmock.h"

namespace tint::spirv::reader::ast_parser::test {

// Default to not dumping the SPIR-V assembly.
bool ASTParserWrapperForTest::dump_successfully_converted_spirv_ = false;

ASTParserWrapperForTest::ASTParserWrapperForTest(const std::vector<uint32_t>& input)
    : impl_(input) {}

ASTParserWrapperForTest::~ASTParserWrapperForTest() {
    if (dump_successfully_converted_spirv_ && !skip_dumping_spirv_ && !impl_.spv_binary().empty() &&
        impl_.success()) {
        std::string disassembly = Disassemble(impl_.spv_binary());
        std::cout << "BEGIN ConvertedOk:\n" << disassembly << "\nEND ConvertedOk" << std::endl;
    }
}

std::string ToString(const Program& program) {
    wgsl::writer::ASTPrinter writer(program);
    writer.Generate();

    if (!writer.Diagnostics().empty()) {
        return "WGSL writer error: " + writer.Diagnostics().str();
    }
    return writer.Result();
}

std::string ToString(const Program& program, VectorRef<const ast::Statement*> stmts) {
    wgsl::writer::ASTPrinter writer(program);
    for (const auto* stmt : stmts) {
        writer.EmitStatement(stmt);
    }
    if (!writer.Diagnostics().empty()) {
        return "WGSL writer error: " + writer.Diagnostics().str();
    }
    return writer.Result();
}

std::string ToString(const Program& program, const ast::Node* node) {
    wgsl::writer::ASTPrinter writer(program);
    return Switch(
        node,
        [&](const ast::Expression* expr) {
            StringStream out;
            writer.EmitExpression(out, expr);
            if (!writer.Diagnostics().empty()) {
                return "WGSL writer error: " + writer.Diagnostics().str();
            }
            return out.str();
        },
        [&](const ast::Statement* stmt) {
            writer.EmitStatement(stmt);
            if (!writer.Diagnostics().empty()) {
                return "WGSL writer error: " + writer.Diagnostics().str();
            }
            return writer.Result();
        },
        [&](const ast::Identifier* ident) { return ident->symbol.Name(); },
        [&](Default) {
            return "<unhandled AST node type " + std::string(node->TypeInfo().name) + ">";
        });
}

}  // namespace tint::spirv::reader::ast_parser::test
