/*
 * Copyright (c) 2024 Huawei Device Co., Ltd.
 * 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.
 */

import { EOL } from "node:os"

export class TokenPrinter {
    private readonly tokens: string[][] = [[]]

    put(...chunks:string[]): this {
        this.tokens.at(-1)?.push(...chunks)
        return this
    }
    newline(): this {
        this.tokens.push([])
        return this
    }

    render(): string {
        return this.tokens.map(line => line.join('')).join(EOL)
    }
}

export class IndentPrinter extends TokenPrinter {

    constructor(
        private readonly tabLength = 2
    ) { super() }

    private tabSize = 0

    inc(): this {
        this.tabSize++
        return this
    }
    dec(): this {
        this.tabSize--
        return this
    }

    override newline(): this {
        super.newline()
        this.put(' '.repeat(this.tabSize * this.tabLength))
        return this
    }
}