/*******************************************************************************
 * Copyright (c) 2010 BSI Business Systems Integration AG.
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License v1.0
 * which accompanies this distribution, and is available at
 * http://www.eclipse.org/legal/epl-v10.html
 *
 * Contributors:
 *     BSI Business Systems Integration AG - initial API and implementation
 ******************************************************************************/
package org.eclipse.scout.sdk.internal.test.operation.project;

import org.eclipse.core.resources.IMarker;
import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.core.runtime.NullProgressMonitor;
import org.eclipse.jdt.core.ICompilationUnit;
import org.eclipse.jdt.core.IType;
import org.eclipse.jdt.core.ITypeHierarchy;
import org.eclipse.scout.sdk.ScoutSdkCore;
import org.eclipse.scout.sdk.extensions.runtime.classes.RuntimeClasses;
import org.eclipse.scout.sdk.helper.ScoutProjectHelper;
import org.eclipse.scout.sdk.internal.test.AbstractScoutSdkTest;
import org.eclipse.scout.sdk.jdt.compile.ScoutSeverityManager;
import org.eclipse.scout.sdk.operation.project.template.OutlineTemplateOperation;
import org.eclipse.scout.sdk.operation.project.template.SingleFormTemplateOperation;
import org.eclipse.scout.sdk.util.PropertyMap;
import org.eclipse.scout.sdk.util.internal.typecache.JavaResourceChangedEmitter;
import org.eclipse.scout.sdk.util.jdt.JdtUtility;
import org.eclipse.scout.sdk.util.type.TypeFilters;
import org.eclipse.scout.sdk.util.type.TypeUtility;
import org.eclipse.scout.sdk.util.typecache.IPrimaryTypeTypeHierarchy;
import org.eclipse.scout.sdk.workspace.IScoutBundle;
import org.eclipse.scout.sdk.workspace.IScoutBundleGraph;
import org.eclipse.scout.sdk.workspace.ScoutBundleFilters;
import org.junit.Assert;
import org.junit.BeforeClass;
import org.junit.Test;

/**
 * TODO work in progress
 */
public class ScoutProjectCreateTest extends AbstractScoutSdkTest {

  @BeforeClass
  public static void setup() {
    ScoutSdkCore.getScoutWorkspace();
  }

  @Test
  public void testCreateBundles() throws Exception {
    try {
      ScoutSdkCore.getScoutWorkspace();
      IScoutBundle project = ScoutProjectHelper.setupNewProject("org.eclipse.testapp", true, true, true, true, false);
      int severity = ScoutSeverityManager.getInstance().getSeverityOf(ResourcesPlugin.getWorkspace().getRoot());
      Assert.assertTrue(severity < IMarker.SEVERITY_ERROR);
      Assert.assertNotNull(project.getChildBundle(ScoutBundleFilters.getBundlesOfTypeFilter(IScoutBundle.TYPE_CLIENT), false));
      Assert.assertNotNull(project.getChildBundle(ScoutBundleFilters.getBundlesOfTypeFilter(IScoutBundle.TYPE_SHARED), true));
      Assert.assertNotNull(project.getChildBundle(ScoutBundleFilters.getBundlesOfTypeFilter(IScoutBundle.TYPE_SERVER), false));
      Assert.assertNotNull(project.getChildBundle(ScoutBundleFilters.getBundlesOfTypeFilter(IScoutBundle.TYPE_UI_SWT), false));
      Assert.assertNull(project.getChildBundle(ScoutBundleFilters.getBundlesOfTypeFilter(IScoutBundle.TYPE_UI_SWING), false));
    }
    finally {
      clearWorkspace();
      IScoutBundleGraph bundleGraph = ScoutSdkCore.getScoutWorkspace().getBundleGraph();
      bundleGraph.waitFor();
      Assert.assertEquals(0, bundleGraph.getBundles(ScoutBundleFilters.getRootBundlesFilter()).length);
    }
  }

  @Test
  public void testLoop() throws Exception {
    // create 5 times a project with the same name and remove it again
    for (int i = 0; i < 5; i++) {
      System.out.println("-------------- start " + i + "--------------");
      testTemplateDesktopForm("org.eclipse.testapp");
      for (ICompilationUnit icu : JavaResourceChangedEmitter.getPendingWorkingCopies()) {
        System.out.println("still available resource: " + icu.getElementName());
      }
      System.out.println("-------------- end " + i + "--------------");
    }
  }

  private void testTemplateDesktopForm(String projectName) throws Exception {
    try {
      PropertyMap properties = new PropertyMap();
      ScoutProjectHelper.setupNewProject(projectName, true, true, true, properties);

      final IType iForm = TypeUtility.getType(RuntimeClasses.IForm);
      ITypeHierarchy hierarchy = iForm.newTypeHierarchy(new NullProgressMonitor());
      for (IType tx : hierarchy.getAllSubtypes(iForm)) {
        if (tx.getElementName().equals("DesktopForm")) {
          System.out.println("EEKEKEKKEKEKEKKEKEKKEKEKEKKEKEKKEKE ");
        }
      }
      final IPrimaryTypeTypeHierarchy formHierarchy = TypeUtility.getPrimaryTypeHierarchy(iForm);
      IType[] subtypes = formHierarchy.getAllSubtypes(iForm, TypeFilters.getInWorkspaceFilter());
      if (subtypes.length > 0) {
        System.out.println("Should not come up:");
        for (IType t : subtypes) {
          System.out.println(" - " + t.getFullyQualifiedName() + " exists " + TypeUtility.exists(t) + "  " + t.getResource().exists());
        }
      }
      Assert.assertEquals(0, subtypes.length);
      SingleFormTemplateOperation op = new SingleFormTemplateOperation();
      op.setProperties(properties);
      op.init();
      executeBuildAssertNoCompileErrors(op);

      JdtUtility.waitForIndexesReady();
      System.out.println("iForm exists " + iForm.exists() + "  " + iForm.getJavaProject().exists());
      subtypes = formHierarchy.getAllSubtypes(iForm, TypeFilters.getInWorkspaceFilter());
//      if (subtypes.length == 0) {
//        formHierarchy.invalidate();
//        subtypes = formHierarchy.getAllSubtypes(iForm, TypeFilters.getInWorkspaceFilter());
//        System.out.println(subtypes.length);
//      }
      if (subtypes.length != 1) {
        System.out.println("NOT FIRED RESOURCES -------");
        for (ICompilationUnit icu : JavaResourceChangedEmitter.getPendingWorkingCopies()) {
          System.out.println(" - '" + icu.getElementName() + "'");
        }
        System.out.println("EEEEEEEEEEEEEEEEEEEEEERRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRROOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOORRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRR");
        Thread.sleep(10000);
      }
      Assert.assertEquals(1, subtypes.length);
    }
    finally {
      clearWorkspace();
      Assert.assertEquals(0, ScoutSdkCore.getScoutWorkspace().getBundleGraph().getBundles(ScoutBundleFilters.getRootBundlesFilter()).length);
    }

  }

  @Test
  public void testTemplateOutlineTreeTable() throws Exception {
    try {
      PropertyMap properties = new PropertyMap();
      ScoutProjectHelper.setupNewProject("org.eclipse.testapp1", true, true, true, properties);

      final IType iForm = TypeUtility.getType(RuntimeClasses.IForm);
      final IPrimaryTypeTypeHierarchy formHierarchy = TypeUtility.getPrimaryTypeHierarchy(iForm);
      IType[] subtypes = formHierarchy.getAllSubtypes(iForm, TypeFilters.getInWorkspaceFilter());
      Assert.assertEquals(0, subtypes.length);

      OutlineTemplateOperation op = new OutlineTemplateOperation();
      op.setProperties(properties);
      op.init();
      executeBuildAssertNoCompileErrors(op);
    }
    finally {
      clearWorkspace();
      Assert.assertEquals(0, ScoutSdkCore.getScoutWorkspace().getBundleGraph().getBundles(ScoutBundleFilters.getRootBundlesFilter()).length);
    }
  }
}
