// Copyright 2021 The Tint Authors
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//     http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

#include "src/tint/reader/spirv/parser_impl_test_helper.h"
#include "src/tint/writer/wgsl/generator_impl.h"

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

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

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

ParserImplWrapperForTest::~ParserImplWrapperForTest() {
    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) {
    writer::wgsl::GeneratorImpl writer(&program);
    if (!writer.Generate()) {
        return "WGSL writer error: " + writer.error();
    }
    return writer.result();
}

std::string ToString(const Program& program, const ast::StatementList& stmts) {
    writer::wgsl::GeneratorImpl writer(&program);
    for (const auto* stmt : stmts) {
        if (!writer.EmitStatement(stmt)) {
            return "WGSL writer error: " + writer.error();
        }
    }
    return writer.result();
}

std::string ToString(const Program& program, const ast::Node* node) {
    writer::wgsl::GeneratorImpl writer(&program);
    if (auto* expr = node->As<ast::Expression>()) {
        std::stringstream out;
        if (!writer.EmitExpression(out, expr)) {
            return "WGSL writer error: " + writer.error();
        }
        return out.str();
    } else if (auto* stmt = node->As<ast::Statement>()) {
        if (!writer.EmitStatement(stmt)) {
            return "WGSL writer error: " + writer.error();
        }
    } else if (auto* ty = node->As<ast::Type>()) {
        std::stringstream out;
        if (!writer.EmitType(out, ty)) {
            return "WGSL writer error: " + writer.error();
        }
        return out.str();
    } else {
        return "<unhandled AST node type " + std::string(node->TypeInfo().name) + ">";
    }
    return writer.result();
}

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