package consolehtmlbrowser.handlers;

import consolehtmlbrowser.events.HtmlTagParsedEvent;
import consolehtmlbrowser.listeners.HtmlDoctypeListener;
import consolehtmlbrowser.listeners.HtmlTagParsedListener;
import consolehtmlbrowser.raisers.HtmlParser;
import java.io.PrintStream;

/**
 *
 * @author trust56
 */
public class ConsoleHtmlBrowser {

    private PrintStream output = System.out;
    private boolean somethingWasWrittenSinceLastNewline = false;
    private HtmlDoctypeListener htmlDoctypeListener = new HtmlDoctypeListener() {

        @Override
        public void doctypeFound(String docType) {
            output.println("The doctype of the document is: " + docType);
        }
    };
    private HtmlTagParsedListener htmlTagParsedListener = new HtmlTagParsedListener() {

        @Override
        public void tagParsed(HtmlTagParsedEvent descriptor) {
            String tagName = descriptor.getTagName();
            if (tagName.equals("a")) {
                output.print("[");
                if (descriptor.hasAttribute("href")) {
                    output.print(descriptor.getAttributeValue("href"));
                    output.print(" ");
                }
                output.print(htmlTransform(descriptor.getContent()));
                output.print("] ");
                somethingWasWrittenSinceLastNewline = true;
            } else if (tagName.equals("br") && somethingWasWrittenSinceLastNewline) {
                output.println();
                somethingWasWrittenSinceLastNewline = false;
            } else if (tagName.equals("tr") && somethingWasWrittenSinceLastNewline) {
                output.println();
                somethingWasWrittenSinceLastNewline = false;
            } else if (tagName.equals("td") && somethingWasWrittenSinceLastNewline) {
                output.print("\t");
                somethingWasWrittenSinceLastNewline = false;
            } else if (tagName.equals("title")) {
                output.println();
                output.println("The title of the document is: " + htmlTransform(descriptor.getContent()));
            } else if (tagName.equals("img")) {
                // images cannot be drawn onto the console
            } else if (tagName.equals("script")) {
                // don't want to bother with javascripts
            } else if (tagName.equals("style")) {
                // don't want to bother with styles
            } else {
                output.print(htmlTransform(descriptor.getContent()));
            }
        }

        private String htmlTransform(String htmlOriginal) {
            return htmlOriginal.replace("&nbsp;", " ").replace("&gt;", ">").replace("&lt;", "<");
        }
    };

    public void registerEventHandlers(HtmlParser parser) {
        parser.addDoctypeListener(htmlDoctypeListener);
        parser.addTagParsedListener(htmlTagParsedListener);
    }
}
