package freenet.clients.http;

import freenet.client.HighLevelSimpleClient;
import freenet.clients.http.PageMaker.RenderParameters;
import freenet.l10n.NodeL10n;
import freenet.node.Node;
import freenet.support.HTMLNode;
import freenet.support.MultiValueTable;
import freenet.support.api.HTTPRequest;

import java.io.IOException;
import java.net.URI;

/**
 * The External Link Toadlet 
 */
public class ExternalLinkToadlet extends Toadlet {

	private static final int MAX_URL_LENGTH = 1024 * 1024;
	public static final String PATH = "/external-link/";
	private static final String magicHTTPEscapeString = "_CHECKED_HTTP_";

	private final Node node;

	ExternalLinkToadlet(HighLevelSimpleClient client, Node node) {
		super(client);
		this.node = node;
	}

	@Override
	public String path() {
		return PATH;
	}

	public void handleMethodPOST(URI uri, HTTPRequest request, ToadletContext ctx) throws ToadletContextClosedException, IOException {
		String url = request.getPartAsStringFailsafe(magicHTTPEscapeString, MAX_URL_LENGTH);
		MultiValueTable<String, String> headers = new MultiValueTable<String, String>();
		//If the user clicked cancel, or the URL is not defined, return to the main page.
		//TODO: This will mean the beginning of the first time wizard if it's still in progress.
		//TODO: Is it worth it to fix that?
		if (request.getPartAsStringFailsafe("Go", 32).isEmpty() || url.isEmpty()) {
			url = WelcomeToadlet.PATH;
		}
		headers.put("Location", url);
		ctx.sendReplyHeaders(302, "Found", headers, null, 0);
	}

	public void handleMethodGET(URI uri, HTTPRequest request, ToadletContext ctx) throws ToadletContextClosedException, IOException {

		//Unexpected: a URL should have been specified.
		if (request.getParam(magicHTTPEscapeString).isEmpty()) {
			MultiValueTable<String, String> headers = new MultiValueTable<String, String>();
			headers.put("Location", WelcomeToadlet.PATH);
			ctx.sendReplyHeaders(302, "Found", headers, null, 0);
			return;
		}

		//Confirm whether the user really means to access an HTTP link.
		//Only render status and navigation bars if the user has completed the wizard.
		boolean renderBars = node.clientCore.getToadletContainer().fproxyHasCompletedWizard();
		PageNode page = ctx.getPageMaker().getPageNode(l10n("confirmExternalLinkTitle"), ctx, new RenderParameters().renderNavigationLinks(renderBars).renderStatus(renderBars));
		HTMLNode pageNode = page.outer;
		HTMLNode contentNode = page.content;
		HTMLNode warnboxContent = ctx.getPageMaker().getInfobox("infobox-warning",
			l10n("confirmExternalLinkSubTitle"), contentNode, "confirm-external-link", true);
		HTMLNode externalLinkForm = ctx.addFormChild(warnboxContent, PATH, "confirmExternalLinkForm");

		final String target = request.getParam(magicHTTPEscapeString);
		externalLinkForm.addChild("#", l10n("confirmExternalLinkWithURL", "url", target));
		externalLinkForm.addChild("br");
		externalLinkForm.addChild("input",
			new String[]{"type", "name", "value"},
			new String[]{"hidden", magicHTTPEscapeString, target});
		externalLinkForm.addChild("input",
			new String[]{"type", "name", "value"},
			new String[]{"submit", "cancel", NodeL10n.getBase().getString("Toadlet.cancel")});
		externalLinkForm.addChild("input",
			new String[]{"type", "name", "value"},
			new String[]{"submit", "Go", l10n("goToExternalLink")});

		this.writeHTMLReply(ctx, 200, "OK", null, pageNode.generate(), true);
	}

	/**
	 * Prepends a given URI with the path and parameter names to get this external link confirmation page.
	 * @param uri URI to prompt for confirmation.
	 * @return String appropriate for a link.
	 */
	public static String escape(String uri) {
		return ExternalLinkToadlet.PATH+"?" + magicHTTPEscapeString + '=' + uri;
	}

	private static String l10n(String key, String pattern, String value) {
		return NodeL10n.getBase().getString("WelcomeToadlet." + key, new String[]{pattern}, new String[]{value});
	}

	private static String l10n(String key) {
		return NodeL10n.getBase().getString("WelcomeToadlet." + key);
	}
}
