/*
 * Copyright (c) 2014 Eike Stepper (Berlin, Germany) and others.
 * 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:
 *    Eike Stepper - initial API and implementation
 */
package org.eclipse.oomph.winexplorer;

import org.eclipse.core.commands.AbstractHandler;
import org.eclipse.core.commands.ExecutionEvent;
import org.eclipse.core.commands.ExecutionException;
import org.eclipse.core.resources.IContainer;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.runtime.IAdaptable;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jgit.lib.Repository;
import org.eclipse.ui.handlers.HandlerUtil;

import java.io.File;

/**
 * @author Eike Stepper
 */
public abstract class AbstractLocationHandler extends AbstractHandler
{
  public AbstractLocationHandler()
  {
  }

  public Object execute(ExecutionEvent event) throws ExecutionException
  {
    ISelection selection = HandlerUtil.getActiveMenuSelection(event);
    File location = getLocation(selection);

    try
    {
      execute(location);
    }
    catch (Exception ex)
    {
      ex.printStackTrace();
    }

    return null;
  }

  protected abstract void execute(File location) throws Exception;

  public static File getLocation(ISelection selection)
  {
    if (selection instanceof IStructuredSelection)
    {
      IStructuredSelection ssel = (IStructuredSelection)selection;
      Object element = ssel.getFirstElement();
      return getLocation(element);
    }

    return null;
  }

  private static File getLocation(Object element)
  {
    IContainer container = getContainer(element);
    if (container != null)
    {
      return new File(container.getLocation().toOSString());
    }

    File directory = getDirectory(element);
    if (directory != null)
    {
      return directory;
    }

    File workTree = getWorkTree(element);
    if (workTree != null)
    {
      return workTree;
    }

    return null;
  }

  private static IContainer getContainer(Object element)
  {
    if (element instanceof IContainer)
    {
      return (IContainer)element;
    }

    if (element instanceof IResource)
    {
      return ((IResource)element).getParent();
    }

    if (element instanceof IAdaptable)
    {
      Object adapter = ((IAdaptable)element).getAdapter(IResource.class);
      return getContainer(adapter);
    }

    return null;
  }

  private static File getDirectory(Object element)
  {
    if (element instanceof File)
    {
      File file = (File)element;
      if (file.isDirectory())
      {
        return file;
      }

      return file.getParentFile();
    }

    if (element instanceof IAdaptable)
    {
      Object adapter = ((IAdaptable)element).getAdapter(File.class);
      return getDirectory(adapter);
    }

    return null;
  }

  private static File getWorkTree(Object element)
  {
    try
    {
      return GitHelper.getWorkTree(element);
    }
    catch (Throwable ex)
    {
      return null;
    }
  }

  /**
   * @author Eike Stepper
   */
  private static final class GitHelper
  {
    public static File getWorkTree(Object element)
    {
      if (element instanceof Repository)
      {
        return ((Repository)element).getWorkTree();
      }

      if (element instanceof IAdaptable)
      {
        Object adapter = ((IAdaptable)element).getAdapter(Repository.class);
        return getWorkTree(adapter);
      }

      return null;
    }
  }
}
