/*
 * Copyright (c) Huawei Technologies Co., Ltd. 2024-2024. All rights reserved.
 */
package commonmark4cj.commonmark

/**
 * Opening bracket for links ({@code [}), images ({@code ![}), or links with other markers.
 */
public class Bracket {

    /**
     * The node of a marker such as {@code !} if present, null otherwise.
     */
    public let markerNode: ?Text

    /**
     * The position of the marker if present, null otherwise.
     */
    public let markerPosition: ?SourcePosition

    /**
     * The node of {@code [}.
     */
    public let bracketNode: Text

    /**
     * The position of {@code [}.
     */
    public let bracketPosition: SourcePosition

    /**
     * The position of the content (after the opening bracket)
     */
    public let contentPosition: SourcePosition

    /**
     * Previous bracket.
     */
    public let previous: ?Bracket

    /**
     * Previous delimiter (emphasis, etc) before this bracket.
     */
    public let previousDelimiter: ?Delimiter

    /**
     * Whether this bracket is allowed to form a link/image (also known as "active").
     */
    public var allowed: Bool = true

    /**
     * Whether there is an unescaped bracket (opening or closing) after this opening bracket in the text parsed so far.
     */
    public var bracketAfter: Bool = false

    public static func link(bracketNode: Text, bracketPosition: SourcePosition, contentPosition: SourcePosition,
        previous: ?Bracket, previousDelimiter: ?Delimiter): Bracket {
        return Bracket(None, None, bracketNode, bracketPosition, contentPosition, previous, previousDelimiter)
    }

    public static func withMarker(markerNode: Text, markerPosition: SourcePosition, bracketNode: Text,
        bracketPosition: SourcePosition, contentPosition: SourcePosition, previous: ?Bracket,
        previousDelimiter: ?Delimiter): Bracket {
        return Bracket(markerNode, markerPosition, bracketNode, bracketPosition, contentPosition, previous,
            previousDelimiter)
    }

    private init(markerNode: ?Text, markerPosition: ?SourcePosition, bracketNode: Text, bracketPosition: SourcePosition,
        contentPosition: SourcePosition, previous: ?Bracket, previousDelimiter: ?Delimiter) {
        this.markerNode = markerNode
        this.markerPosition = markerPosition
        this.bracketNode = bracketNode
        this.bracketPosition = bracketPosition
        this.contentPosition = contentPosition
        this.previous = previous
        this.previousDelimiter = previousDelimiter
    }
}