/*
 *    Copyright 2017 tiagohm
 *
 *    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.
 */

package br.tiagohm.markdownview.ext.video.internal;

import com.vladsch.flexmark.ast.Document;
import com.vladsch.flexmark.ast.Link;
import com.vladsch.flexmark.ast.Node;
import com.vladsch.flexmark.ast.Text;
import com.vladsch.flexmark.parser.block.NodePostProcessor;
import com.vladsch.flexmark.parser.block.NodePostProcessorFactory;
import com.vladsch.flexmark.util.NodeTracker;
import com.vladsch.flexmark.util.options.DataHolder;
import com.vladsch.flexmark.util.sequence.BasedSequence;

import br.tiagohm.markdownview.ext.video.VideoLink;

public class VideoLinkNodePostProcessor extends NodePostProcessor {
    public VideoLinkNodePostProcessor(DataHolder options) {
    }

    @Override
    public void process(NodeTracker state, Node node) {
        if (node instanceof Link) {
            Node previous = node.getPrevious();

            if (previous instanceof Text) {
                final BasedSequence chars = previous.getChars();

                //Se o nó anterior termina com '@' e é seguido pelo Link
                if (chars.endsWith("@") && chars.isContinuedBy(node.getChars())) {
                    //Remove o caractere '@' do nó anterior.
                    previous.setChars(chars.subSequence(0, chars.length() - 1));
                    VideoLink videoLink = new VideoLink((Link) node);
                    videoLink.takeChildren(node);
                    node.unlink();
                    previous.insertAfter(videoLink);
                    state.nodeRemoved(node);
                    state.nodeAddedWithChildren(videoLink);
                }
            }
        }
    }

    public static class Factory extends NodePostProcessorFactory {
        public Factory(DataHolder options) {
            super(false);

            addNodes(Link.class);
        }

        @Override
        public NodePostProcessor create(Document document) {
            return new VideoLinkNodePostProcessor(document);
        }
    }
}