package io.noties.markwon.ext.tasklist;

import androidx.annotation.NonNull;

import org.apache.commons.io.IOUtils;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.robolectric.RobolectricTestRunner;
import org.robolectric.RuntimeEnvironment;
import org.robolectric.annotation.Config;

import java.io.IOException;
import java.nio.charset.StandardCharsets;

import io.noties.markwon.AbstractMarkwonPlugin;
import io.noties.markwon.Markwon;
import io.noties.markwon.MarkwonConfiguration;
import io.noties.markwon.MarkwonSpansFactory;
import io.noties.markwon.RenderProps;
import io.noties.markwon.SpanFactory;
import io.noties.markwon.test.TestSpan;
import io.noties.markwon.test.TestSpanMatcher;

import static io.noties.markwon.test.TestSpan.span;

@RunWith(RobolectricTestRunner.class)
@Config(manifest = Config.NONE)
public class TaskListTest {

    private static final String SPAN = "task-list";
    private static final String IS_DONE = "is-done";

    @Test
    public void test() {

        final TestSpan.Document document = TestSpan.document(
                TestSpan.span(SPAN, TestSpan.args(IS_DONE, false), TestSpan.text("First")),
                newLine(),
                TestSpan.span(SPAN, TestSpan.args(IS_DONE, true), TestSpan.text("Second")),
                newLine(),
                TestSpan.span(SPAN, TestSpan.args(IS_DONE, true), TestSpan.text("Third")),
                newLine(),
                TestSpan.span(SPAN, TestSpan.args(IS_DONE, false), TestSpan.text("First star")),
                newLine(),
                TestSpan.span(SPAN, TestSpan.args(IS_DONE, true), TestSpan.text("Second star")),
                newLine(),
                TestSpan.span(SPAN, TestSpan.args(IS_DONE, true), TestSpan.text("Third star")),
                newLine(),
                TestSpan.span(SPAN, TestSpan.args(IS_DONE, false), TestSpan.text("First plus")),
                newLine(),
                TestSpan.span(SPAN, TestSpan.args(IS_DONE, true), TestSpan.text("Second plus")),
                newLine(),
                TestSpan.span(SPAN, TestSpan.args(IS_DONE, true), TestSpan.text("Third plus")),
                newLine(),
                TestSpan.span(SPAN, TestSpan.args(IS_DONE, true), TestSpan.text("Number with dot")),
                newLine(),
                TestSpan.span(SPAN, TestSpan.args(IS_DONE, false), TestSpan.text("Number"))
        );

        TestSpanMatcher.matches(
                markwon().toMarkdown(read("task-lists.md")),
                document
        );
    }

    @NonNull
    private static Markwon markwon() {
        return Markwon.builder(RuntimeEnvironment.application)
                .usePlugin(TaskListPlugin.create(RuntimeEnvironment.application))
                .usePlugin(new AbstractMarkwonPlugin() {
                    @Override
                    public void configureSpansFactory(@NonNull MarkwonSpansFactory.Builder builder) {
                        builder.setFactory(TaskListItem.class, new SpanFactory() {
                            @Override
                            public Object getSpans(@NonNull MarkwonConfiguration configuration, @NonNull RenderProps props) {
                                return TestSpan.span(SPAN, TestSpan.args(IS_DONE, TaskListProps.DONE.require(props)));
                            }
                        });
                    }
                })
                .build();
    }

    @SuppressWarnings("SameParameterValue")
    @NonNull
    private static String read(@NonNull String name) {
        try {
            return IOUtils.resourceToString("tests/" + name, StandardCharsets.UTF_8, TaskListDrawable.class.getClassLoader());
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
    }

    @NonNull
    private static TestSpan.Text newLine() {
        return TestSpan.text("\n");
    }
}