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

#include "include/private/SkSLSampleUsage.h"

#include "src/sksl/ir/SkSLBinaryExpression.h"
#include "src/sksl/ir/SkSLConstructor.h"
#include "src/sksl/ir/SkSLDoStatement.h"
#include "src/sksl/ir/SkSLExpression.h"
#include "src/sksl/ir/SkSLExpressionStatement.h"
#include "src/sksl/ir/SkSLFieldAccess.h"
#include "src/sksl/ir/SkSLForStatement.h"
#include "src/sksl/ir/SkSLFunctionCall.h"
#include "src/sksl/ir/SkSLIfStatement.h"
#include "src/sksl/ir/SkSLIndexExpression.h"
#include "src/sksl/ir/SkSLPostfixExpression.h"
#include "src/sksl/ir/SkSLPrefixExpression.h"
#include "src/sksl/ir/SkSLProgram.h"
#include "src/sksl/ir/SkSLReturnStatement.h"
#include "src/sksl/ir/SkSLSwitchStatement.h"
#include "src/sksl/ir/SkSLSwizzle.h"
#include "src/sksl/ir/SkSLTernaryExpression.h"
#include "src/sksl/ir/SkSLVarDeclarationsStatement.h"
#include "src/sksl/ir/SkSLVariable.h"
#include "src/sksl/ir/SkSLWhileStatement.h"

namespace SkSL {

SampleUsage SampleUsage::merge(const SampleUsage& other) {
    if (other.fExplicitCoords) { fExplicitCoords = true; }
    if (other.fPassThrough)    { fPassThrough    = true; }
    if (other.fHasPerspective) { fHasPerspective = true; }

    if (other.fKind == Kind::kVariable) {
        fKind = Kind::kVariable;
        fExpression.clear();
    } else if (other.fKind == Kind::kUniform) {
        if (fKind == Kind::kUniform) {
            if (fExpression != other.fExpression) {
                fKind = Kind::kVariable;
                fExpression.clear();
            } else {
                // Identical uniform expressions, so leave things as-is
            }
        } else if (fKind == Kind::kNone) {
            fKind = Kind::kUniform;
            fExpression = other.fExpression;
        } else {
            // We were already variable, so leave things as-is
            SkASSERT(fKind == Kind::kVariable);
        }
    } else {
        // other had no matrix information, so we're done
    }

    return *this;
}

std::string SampleUsage::constructor(std::string perspectiveExpression) const {
    SkASSERT(this->hasMatrix() || perspectiveExpression.empty());
    if (perspectiveExpression.empty()) {
        perspectiveExpression = fHasPerspective ? "true" : "false";
    }

    // Check for special cases where we can use our factories:
    if (!this->hasMatrix()) {
        if (fExplicitCoords && !fPassThrough) {
            return "SkSL::SampleUsage::Explicit()";
        } else if (fPassThrough && !fExplicitCoords) {
            return "SkSL::SampleUsage::PassThrough()";
        }
    }
    if (!fExplicitCoords && !fPassThrough) {
        if (fKind == Kind::kVariable) {
            return "SkSL::SampleUsage::VariableMatrix(" + perspectiveExpression + ")";
        } else if (fKind == Kind::kUniform) {
            return "SkSL::SampleUsage::UniformMatrix(\"" + fExpression + "\", " +
                   perspectiveExpression + ")";
        }
    }

    // For more complex scenarios (mixed sampling), fall back to our universal constructor
    std::string result = "SkSL::SampleUsage(SkSL::SampleUsage::Kind::";
    switch (fKind) {
        case Kind::kNone:     result += "kNone";     break;
        case Kind::kUniform:  result += "kUniform";  break;
        case Kind::kVariable: result += "kVariable"; break;
    }
    result += ", \"";
    result += fExpression;
    result += "\", ";
    result += perspectiveExpression;
    result += ", ";
    result += fExplicitCoords ? "true, " : "false, ";
    result += fPassThrough    ? "true)"  : "false)";

    return result;
}

} // namespace
