/*******************************************************************************
 * Copyright (c) 2010, 2018 THALES GLOBAL SERVICES.
 * 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:
 *    Obeo - initial API and implementation
 *******************************************************************************/
package org.eclipse.sirius.tests.swtbot.table;

import org.eclipse.sirius.ext.base.Option;
import org.eclipse.sirius.tests.support.api.TestsUtil;
import org.eclipse.sirius.tests.swtbot.Activator;
import org.eclipse.sirius.tests.swtbot.support.api.AbstractSiriusSwtBotGefTestCase;
import org.eclipse.sirius.tests.swtbot.support.api.business.UIResource;
import org.eclipse.sirius.tests.swtbot.support.api.business.UITableRepresentation;
import org.eclipse.sirius.tests.swtbot.support.api.business.UITreeRepresentation;
import org.eclipse.sirius.tests.swtbot.support.api.condition.SessionSavedCondition;
import org.eclipse.sirius.tests.swtbot.support.api.editor.SWTBotSiriusHelper;
import org.eclipse.swtbot.eclipse.finder.widgets.SWTBotView;
import org.eclipse.swtbot.swt.finder.exceptions.WidgetNotFoundException;
import org.eclipse.swtbot.swt.finder.widgets.SWTBotCCombo;
import org.eclipse.swtbot.swt.finder.widgets.SWTBotCheckBox;
import org.eclipse.swtbot.swt.finder.widgets.SWTBotText;
import org.eclipse.swtbot.swt.finder.widgets.SWTBotTree;
import org.eclipse.swtbot.swt.finder.widgets.SWTBotTreeItem;

/**
 * Test setting property of a table editor by the properties view with an other
 * editor tree open and setting property of a tree editor by the properties view
 * with an other table editor open. Test VP-1896.
 * 
 * 
 * @author jdupont
 */
public class SetPropertyOfTableTreeByPropertiesViewTest extends AbstractSiriusSwtBotGefTestCase {

    private static final String VIEWPOINT_NAME = "1896";

    private static final String VSM_FILE = "1896.odesign";

    private static final String SESSION_FILE = "1896.aird";

    private static final String ECORE_FILE = "1896.ecore";

    private static final String FILE_DIR = "/";

    private static final String DATA_UNIT_DIR = "data/unit/table/setPropertyTable/vp-1896/";

    private static final String REPRESENTATION_TABLE_NAME = "Table";

    private static final String REPRESENTATION_TREE_NAME = "Tree";

    private static final String REPRESENTATION_TABLE_INSTANCE_NAME = "new Table";

    private static final String REPRESENTATION_TREE_INSTANCE_NAME = "new Tree";

    private static final String CLASS1 = "new EClass 1";

    private static final String CLASS1_RENAME = "new EClass 1 rename";

    private static final String PROPERTIES = "Properties";

    private static final String SEMANTIC = "Semantic";

    private static final String REFRESH_TABLE = "Force a refresh of the table";

    private static final String REFRESH_TREE = "Force a refresh of the tree";

    /**
     * Current table.
     */
    protected UITableRepresentation table;

    /**
     * Current tree.
     */
    protected UITreeRepresentation tree;

    /**
     * Test Properties view title.
     * <P>
     * Step 1 : open a table representations
     * <p>
     * Step 2 : select an element
     * <p>
     * Step 3 : check the properties view title is equals to the label of the
     * semantic element ("equals" -> the title comes from the item provider.
     */
    public void testTablePropertiesViewTitle() {
        // Step 1: open table
        openTableEditor();

        // Step 2: select a table element.
        table.getTable().select(0, 0);
        String cell = table.getTable().cell(0, 0);

        // Step 3: check the properties view title.
        SWTBotView propertiesBot = bot.viewByTitle(PROPERTIES);
        propertiesBot.setFocus();
        Option<String> title = SWTBotSiriusHelper.getPropertyItemTitle();
        assertTrue(title.some());
        assertEquals(cell, title.get());
    }

    /**
     * Test Properties view title.
     * <P>
     * Step 1 : open a tree representations
     * <p>
     * Step 2 : select an element
     * <p>
     * Step 3 : check the properties view title is equals to the label of the
     * semantic element ("equals" -> the title comes from the item provider.
     */
    public void testTreePropertiesViewTitle() {
        // Step 1: open tree
        openTreeEditor();
        openTableEditor();

        // Step 2: select a table element.
        tree.getTree().select(0, 0);
        String cell = tree.getTree().selection().get(0,0);

        // Step 3: check the properties view title.
        SWTBotView propertiesBot = bot.viewByTitle(PROPERTIES);
        propertiesBot.setFocus();
        Option<String> title = SWTBotSiriusHelper.getPropertyItemTitle();
        assertTrue(title.some());
        assertEquals(cell, title.get());
    }

    /**
     * Test modify string field (name of semantic element) in property view of
     * table.
     * <P>
     * Step 1 : open a tree and table representations
     * <p>
     * Step 2 : change name of semantic element
     * <p>
     * Step 3 : Verify that the tree and table representation element have name
     * modified
     * <p>
     * Step 4 : Undo change; Verify that the tree and table representation have
     * the name stating. Verify that the undo command next, has nothing to do
     * with renaming.
     */
    public void testModifyTablePropertyViewStringField() {
        // Step 1 : open tree and table
        openTreeEditor();
        openTableEditor();

        // Change the cell content.
        renameCellContent(CLASS1, CLASS1_RENAME);

        // The refresh is automatically do in runtime but with SWTBot it's
        // necessary to do a manual refresh
        table.getTable().select(0, 0);
        table.save();
        manualRefreshTable();

        // Verify that the tree element is rename too
        checkTreeRename(CLASS1_RENAME);

        // Check there is only one undo for the rename
        checkUndoRenameAction();
    }

    /**
     * Test modify string field (name of semantic element) in property view of
     * tree.
     * <P>
     * Step 1 : open a tree and table representations
     * <p>
     * Step 2 : change name of semantic element
     * <p>
     * Step 3 : Verify that the tree and table representation element have name
     * modified
     * <p>
     * Step 4 : Undo change; Verify that the tree and table representation have
     * the name stating. Verify that the undo command next, has nothing to do
     * with renaming.
     */
    public void testModifyTreePropertyViewStringField() {
        // Step 1 : open tree and table
        openTableEditor();
        openTreeEditor();

        // Change the cell content.
        renameTreeContent(CLASS1, CLASS1_RENAME);

        // The refresh is automatically do in runtime but with SWTBot it's
        // necessary to do a manual refresh
        tree.getTree().select(0, 0);
        tree.save();
        manualRefreshTree();

        // Verify that the tree element is rename too
        checkTableRename(CLASS1_RENAME);

        // Check there is only one undo for the rename
        checkUndoRenameAction();
    }

    /**
     * Test modify boolean field (field to pass semantic element to abstract) in
     * property view of table.
     * <P>
     * Step 1 : open a tree and table representations
     * <p>
     * Step 2 : change type abstract of semantic element
     * <p>
     * Step 3 : Verify that the tree and table representation have abstract type
     * modified
     * <p>
     * Step 4 : Undo change; Verify that the tree and table representation have
     * the abstract stating. Verify that the undo command next, has nothing to
     * do with change abstract.
     */
    public void testModifyTablePropertyViewBooleanField() {
        // Step 1 : open tree and table
        openTreeEditor();
        openTableEditor();

        // Change the cell content.
        changeTypeToAbstract(CLASS1, table.getTable());

        // The refresh is automatically do in runtime but with SWTBot it's
        // necessary to do a manual refresh
        table.getTable().select(0, 0);
        table.save();
        bot.waitUntil(new SessionSavedCondition(localSession.getOpenedSession()));

        manualRefreshTable();

        // Verify that the tree element is abstract too
        checkElementIsAbstract(CLASS1, tree.getTree(), true);

        // Check there is only one undo for the rename
        checkUndoAbstractAction();
    }

    /**
     * Test modify boolean field (field to pass semantic element to abstract) in
     * property view of tree.
     * <P>
     * Step 1 : open a tree and table representations
     * <p>
     * Step 2 : change type abstract of semantic element
     * <p>
     * Step 3 : Verify that the tree and table representation have abstract type
     * modified
     * <p>
     * Step 4 : Undo change; Verify that the tree and table representation have
     * the abstract stating. Verify that the undo command next, has nothing to
     * do with change abstract.
     */
    public void testModifyTreePropertyViewBooleanField() {
        // Step 1 : open tree and table
        openTreeEditor();
        openTableEditor();

        // Change the cell content.
        changeTypeToAbstract(CLASS1, tree.getTree());

        // The refresh is automatically do in runtime but with SWTBot it's
        // necessary to do a manual refresh
        tree.getTree().select(0, 0);
        tree.save();
        manualRefreshTree();

        // Verify that the tree element is abstract too
        checkElementIsAbstract(CLASS1, table.getTable(), true);

        // Check there is only one undo for the rename
        checkUndoAbstractAction();
    }

    /**
     * {@inheritDoc}
     */
    @Override
    protected void onSetUpBeforeClosingWelcomePage() throws Exception {
        copyFileToTestProject(Activator.PLUGIN_ID, DATA_UNIT_DIR, getFilesUsedForTest());
    }

    /**
     * {@inheritDoc}
     */
    @Override
    protected void onSetUpAfterOpeningDesignerPerspective() throws Exception {
        sessionAirdResource = new UIResource(designerProject, FILE_DIR, SESSION_FILE);
        localSession = designerPerspective.openSessionFromFile(sessionAirdResource);
    }

    @Override
    protected void tearDown() throws Exception {
        super.tearDown();
    }

    /**
     * Request an explicit refresh of the current table.
     */
    private void manualRefreshTable() {
        bot.toolbarButtonWithTooltip(REFRESH_TABLE).click();
    }

    /**
     * Request an explicit refresh of the current tree.
     */
    private void manualRefreshTree() {
        bot.toolbarButtonWithTooltip(REFRESH_TREE).click();
    }

    /**
     * Rename table line content
     * 
     * @param content
     *            , the content of line
     * @param contentRename
     *            , the new content of line
     * 
     */
    private void renameCellContent(String content, String contentRename) {
        // Verify that the cell correspond to expected
        assertEquals("The cell not correspond to expected", content, table.getTable().cell(0, 0));
        table.getTable().getTreeItem(content).select();
        SWTBotView propertiesBot = bot.viewByTitle(PROPERTIES);
        propertiesBot.setFocus();
        SWTBotSiriusHelper.selectPropertyTabItem(SEMANTIC);
        SWTBotTree tree = propertiesBot.bot().tree();
        tree.expandNode(content).select().getNode("Name").doubleClick();
        SWTBotText text = propertiesBot.bot().text();
        text.setText(contentRename);
    }

    /**
     * Rename tree content
     * 
     * @param content
     *            , the content of line
     * @param contentRename
     *            , the new content of line
     * 
     */
    private void renameTreeContent(String content, String contentRename) {
        // Verify that the cell correspond to expected
        assertEquals("The cell not correspond to expected", content, tree.getTree().getTreeItem(content).getText());
        tree.getTree().getTreeItem(content).select();
        SWTBotView propertiesBot = bot.viewByTitle(PROPERTIES);
        propertiesBot.setFocus();
        SWTBotSiriusHelper.selectPropertyTabItem(SEMANTIC);
        SWTBotTree tree = propertiesBot.bot().tree();
        tree.expandNode(content).select().getNode("Name").doubleClick();
        SWTBotText text = propertiesBot.bot().text();
        text.setText(contentRename);
    }

    /**
     * Change type to abstract from properties view.
     * 
     * @param content
     *            , the name of semantic element to change in abstract
     * @param swtBotTree
     *            the swtBotTree
     */
    private void changeTypeToAbstract(String content, SWTBotTree swtBotTree) {
        swtBotTree.getTreeItem(content).select();
        SWTBotView propertiesBot = bot.viewByTitle(PROPERTIES);
        propertiesBot.setFocus();
        SWTBotSiriusHelper.selectPropertyTabItem(SEMANTIC);
        SWTBotTree tree = propertiesBot.bot().tree();
        tree.expandNode(content).select().getNode("Abstract").doubleClick();
        if (TestsUtil.isPhotonPlatformOrLater()) {
            SWTBotCheckBox checkBox = propertiesBot.bot().checkBox(0);
            checkBox.select();
        } else {
            SWTBotCCombo comboBox = propertiesBot.bot().ccomboBox(0);
            comboBox.setSelection(1);
        }
    }

    /**
     * Verify that tree element was renamed.
     * 
     * @param contentRename
     *            , the new tree element naming
     */
    private void checkTreeRename(String contentRename) {
        boolean treeRename = false;
        tree.getTree().setFocus();
        manualRefreshTree();
        for (SWTBotTreeItem treeItem : tree.getTree().getAllItems()) {
            if (contentRename.equals(treeItem.getText())) {
                treeRename = true;
                break;
            }
        }
        if (!treeRename) {
            fail("The tree must be renamed");
        }
    }

    /**
     * Verify that table element was renamed.
     * 
     * @param contentRename
     *            , the new table element naming
     */
    private void checkTableRename(String contentRename) {
        boolean treeRename = false;
        table.getTable().setFocus();
        manualRefreshTable();
        for (SWTBotTreeItem treeItem : table.getTable().getAllItems()) {
            if (contentRename.equals(treeItem.getText())) {
                treeRename = true;
                break;
            }
        }
        if (!treeRename) {
            fail("The table must be renamed");
        }
    }

    /**
     * Verify that element is abstract.
     * 
     * @param element
     *            the element who must be abstract
     * @param swtBotTree
     *            swtBotTree
     * @param isAbstract
     *            boolean to know if element is abstract or not
     */
    private void checkElementIsAbstract(String element, SWTBotTree swtBotTree, boolean isAbstract) {
        swtBotTree.getTreeItem(element).select();
        SWTBotView propertiesBot = bot.viewByTitle(PROPERTIES);
        propertiesBot.setFocus();
        SWTBotSiriusHelper.selectPropertyTabItem(SEMANTIC);
        SWTBotTree tree = propertiesBot.bot().tree();
        tree.expandNode(element).select().getNode("Abstract").doubleClick();
        boolean value;
        if (TestsUtil.isPhotonPlatformOrLater()) {
            value = propertiesBot.bot().checkBox().isChecked();
        } else {
            value = Boolean.parseBoolean(propertiesBot.bot().ccomboBox().getText());
        }
        assertEquals("The value of abstract field must be true", isAbstract, value);

    }

    /**
     * Verify that the undo for rename is present only one time
     */
    private void checkUndoRenameAction() {
        // There is 2 undo refresh because there is 2 manual refresh launched
        bot.menu("Edit").menu("Undo Refresh representation").click();
        bot.menu("Edit").menu("Undo Refresh representation").click();
        bot.menu("Edit").menu("Undo Set Name").click();
        try {
            // This is the old command that was call before correct VP-1896
            bot.menu("Edit").menu("Undo Update value by properties view").click();
            fail("The Undo Update value by properties view should not be present");
        } catch (WidgetNotFoundException wnfe) {
            checkTreeRename(CLASS1);
            checkTableRename(CLASS1);
        }
    }

    /**
     * Verify that the undo for abstract is present only one time
     */
    private void checkUndoAbstractAction() {
        bot.menu("Edit").menu("Undo Refresh representation").click();
        bot.menu("Edit").menu("Undo Set Abstract").click();
        try {
            bot.menu("Edit").menu("Undo Update value by properties view").click();
            fail("The Undo Update value by properties view should not be present");
        } catch (WidgetNotFoundException wnfe) {
            checkElementIsAbstract(CLASS1, tree.getTree(), false);
            checkElementIsAbstract(CLASS1, table.getTable(), false);
        }
    }

    /**
     * Open the table editor
     */
    private void openTableEditor() {
        table = localSession.getLocalSessionBrowser().perCategory().selectViewpoint(VIEWPOINT_NAME).selectRepresentation(REPRESENTATION_TABLE_NAME)
                .selectRepresentationInstance(REPRESENTATION_TABLE_INSTANCE_NAME, UITableRepresentation.class).open();
    }

    /**
     * Open the tree editor
     */
    private void openTreeEditor() {
        tree = localSession.getLocalSessionBrowser().perCategory().selectViewpoint(VIEWPOINT_NAME).selectRepresentation(REPRESENTATION_TREE_NAME)
                .selectRepresentationInstance(REPRESENTATION_TREE_INSTANCE_NAME, UITreeRepresentation.class).open();
    }

    /**
     * Return files used in the current test.
     */
    String[] getFilesUsedForTest() {
        return new String[] { VSM_FILE, ECORE_FILE, SESSION_FILE };
    }

}
