/*******************************************************************************
 * Copyright (c) 2004, 2006 IBM Corporation and others.
 *
 * This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License 2.0
 * which accompanies this distribution, and is available at
 * https://www.eclipse.org/legal/epl-2.0/
 *
 * SPDX-License-Identifier: EPL-2.0
 *
 * Contributors:
 *     IBM Corporation - initial API and implementation
 *******************************************************************************/


package org.eclipse.ui.internal.intro.impl.model.url;

import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.internal.intro.impl.IntroPlugin;
import org.eclipse.ui.internal.intro.impl.model.AbstractIntroElement;
import org.eclipse.ui.internal.intro.impl.model.AbstractIntroPage;
import org.eclipse.ui.internal.intro.impl.model.IntroModelRoot;
import org.eclipse.ui.internal.intro.impl.model.IntroPartPresentation;
import org.eclipse.ui.internal.intro.impl.presentations.BrowserIntroPartImplementation;
import org.eclipse.ui.internal.intro.impl.util.Log;

public class ShowHelpURLHandler {
    private IntroURL introURL = null;

    ShowHelpURLHandler(IntroURL url) {
        this.introURL = url;
    }



    public boolean showHelpTopic(String href, String embed, String embedTarget) {
        if (href == null)
            return false;

        boolean isEmbedded = (embed != null && embed
            .equals(IntroURL.VALUE_TRUE)) ? true : false;
        if (isEmbedded == false)
            // still false, check the embedTarget. If embedTarget is set, then
            // we
            // have embedded by default.
            isEmbedded = (embedTarget != null) ? true : false;

        IntroPartPresentation presentation = IntroPlugin.getDefault()
            .getIntroModelRoot().getPresentation();
        String presentationStyle = presentation.getImplementationKind();

        if (isEmbedded
                && presentationStyle
                    .equals(IntroPartPresentation.BROWSER_IMPL_KIND)) {

            // Embedded is true and we have HTML presentation, show href
            // embedded, either in full page, or in div.
            BrowserIntroPartImplementation impl = (BrowserIntroPartImplementation) presentation
                .getIntroPartImplementation();
            // INTRO: maybe add support for navigation
            href = PlatformUI.getWorkbench().getHelpSystem()
                .resolve(href, true).toExternalForm();

            if (embedTarget == null)
                return impl.getBrowser().setUrl(href);

            // embedded in Div case.
            IntroModelRoot model = IntroPlugin.getDefault().getIntroModelRoot();
            return handleEmbedURLInDiv(href, embedTarget, model
                .getCurrentPage());
        }

        // show href in Help window. SWT presentation is handled here.
        // WorkbenchHelp takes care of error handling.
        PlatformUI.getWorkbench().getHelpSystem().displayHelpResource(href);
        return true;
    }


    /*
     * Handles the embedded url case. Clone page and insert an IFrame in the
     * target embed div. Note that only one div per page can be specified as an
     * embed div. This is because we need to mangle the name for the cloned
     * page, and the mangled name id pageId_embedTarget.
     */
    private boolean handleEmbedURLInDiv(String href, String embedTarget,
            AbstractIntroPage currentPage) {

        // re-use a runtime generated page, if found. Create the mangled id for
        // the page and check if page exists first. If not, create one.
        IntroModelRoot model = (IntroModelRoot) currentPage.getParentPage()
            .getParent();
        String currentPageId = null;
        if (currentPage.isIFramePage())
            currentPageId = currentPage.getUnmangledId();
        else
            currentPageId = currentPage.getId();
        String mangledPageId = currentPageId + "_" + "WITH_IFRAME"; //$NON-NLS-1$ //$NON-NLS-2$

        // get current standby state.
        boolean standby = IntroPlugin.isIntroStandby();
        String standbyAsString = standby ? IntroURL.VALUE_TRUE : "false"; //$NON-NLS-1$

        AbstractIntroPage pageWithIFrame = (AbstractIntroPage) model.findChild(
            mangledPageId, AbstractIntroElement.ABSTRACT_PAGE);
        if (pageWithIFrame != null) {
            pageWithIFrame.setIFrameURL(href);
            return introURL.showPage(mangledPageId, standbyAsString);
        }

        // Page never generated, clone and create.
        AbstractIntroPage clonedPage = null;
        try {
            clonedPage = (AbstractIntroPage) currentPage.clone();
        } catch (CloneNotSupportedException ex) {
            // should never be here.
            Log.error("Failed to clone Intro page: " + currentPage.getId(), ex); //$NON-NLS-1$
            return false;
        }

        // embed url as IFrame in target div. We need to find target div in
        // cloned page not in the original page.
        boolean canInjectFrame = clonedPage.injectIFrame(href, embedTarget);
        if (!canInjectFrame)
            // Called method handles error.
            return false;

        clonedPage.setId(mangledPageId);
        model.addChild(clonedPage);
        return introURL.showPage(clonedPage.getId(), standbyAsString);
    }

}
