package org.asamk.signal.output;

import org.slf4j.helpers.MessageFormatter;

import java.io.IOException;
import java.io.Writer;

public final class PlainTextWriterImpl implements PlainTextWriter {

    private final Writer writer;

    private PlainTextWriter indentedWriter;

    public PlainTextWriterImpl(final Writer writer) {
        this.writer = writer;
    }

    @Override
    public void println(String format, Object... args) {
        final var message = MessageFormatter.arrayFormat(format, args).getMessage();

        try {
            writer.write(message);
            writer.write(System.lineSeparator());
            writer.flush();
        } catch (IOException e) {
            throw new AssertionError(e);
        }
    }

    @Override
    public PlainTextWriter indentedWriter() {
        if (indentedWriter == null) {
            indentedWriter = new IndentedPlainTextWriter(this, writer);
        }
        return indentedWriter;
    }

    private static final class IndentedPlainTextWriter implements PlainTextWriter {

        private final static int INDENTATION = 2;

        private final String spaces = " ".repeat(INDENTATION);
        private final PlainTextWriter plainTextWriter;
        private final Writer writer;

        private PlainTextWriter indentedWriter;

        private IndentedPlainTextWriter(final PlainTextWriter plainTextWriter, final Writer writer) {
            this.plainTextWriter = plainTextWriter;
            this.writer = writer;
        }

        @Override
        public void println(final String format, final Object... args) {
            try {
                writer.write(spaces);
            } catch (IOException e) {
                throw new AssertionError(e);
            }
            plainTextWriter.println(format, args);
        }

        @Override
        public PlainTextWriter indentedWriter() {
            if (indentedWriter == null) {
                indentedWriter = new IndentedPlainTextWriter(this, writer);
            }
            return indentedWriter;
        }
    }
}
