/*
 * Copyright (c) Huawei Technologies Co., Ltd. 2025. All rights reserved.
 * This source file is part of the Cangjie project, licensed under Apache-2.0
 * with Runtime Library Exception.
 *
 * See https://cangjie-lang.cn/pages/LICENSE for license information.
 */

// The Cangjie API is in Beta. For details on its capabilities and limitations, please refer to the README file.

package std.unittest.diff

import std.unittest.common.PrettyPrinter

extend String <: AssertPrintable<String> {
    public prop hasNestedDiff: Bool {
        get() { false }
    }
    public func pprintForAssertion(pp: PrettyPrinter, right: String, leftPrefix: String, rightPrefix: String,
        level: Int64): PrettyPrinter {
        return pp.pprintStringDiff(this, right, leftPrefix, rightPrefix, level)
    }
}

extend PrettyPrinter {
    func pprintStringDiff(left: String, right: String, leftPrefix: String, rightPrefix: String, level: Int64) {
        if (left.contains("\n") || right.contains("\n")) {
            if (level == 1) {
                pprintNotEqual(leftPrefix, rightPrefix).appendLine(" (multiline difference below)")
            } else {
                appendLine("Multiline difference:")
            }
            printMultilineDiff(left, right)
        } else {
            let q = "\""
            if (level == 1) {
                pprintNotEqual(leftPrefix, rightPrefix).newLine()
                indent {
                    printOneLineDiff(left, right, leftPrefix: leftPrefix + ": ${q}", rightPrefix: rightPrefix + ": ${q}",
                        leftSuffix: q, rightSuffix: q)
                }
            } else {
                printOneLineDiff(left, right, leftPrefix: leftPrefix + ": ${q}", rightPrefix: rightPrefix + ": ${q}",
                    leftSuffix: q, rightSuffix: q)
            }
        }
        return this
    }
}