/*
 * Copyright (c) 2011, 2015 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.emf.cdo.releng.tasks.table;

import org.eclipse.emf.cdo.releng.tasks.Activator;

import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Status;
import org.eclipse.mylyn.tasks.core.ITask;
import org.eclipse.mylyn.tasks.core.data.ITaskDataManager;
import org.eclipse.mylyn.tasks.core.data.TaskAttribute;
import org.eclipse.mylyn.tasks.core.data.TaskAttributeMapper;
import org.eclipse.mylyn.tasks.core.data.TaskData;

import java.util.Arrays;
import java.util.HashMap;
import java.util.Map;

/**
 * @author Eike Stepper
 */
@SuppressWarnings("restriction")
public class TaskModel
{
  private static final String QUERY_IDENTIFIER = "TaskTable";

  private org.eclipse.mylyn.internal.tasks.core.ITaskList taskList;

  private ITaskDataManager taskDataManager;

  private org.eclipse.mylyn.internal.tasks.core.RepositoryQuery query;

  private LogicalTask[] logicalTasks;

  private Version[] versions;

  // private ITaskListChangeListener taskListListener = new ITaskListChangeListener()
  // {
  // public void containersChanged(Set<TaskContainerDelta> deltas)
  // {
  // for (TaskContainerDelta delta : deltas)
  // {
  // IRepositoryElement element = delta.getElement();
  // if (element instanceof ITask && query.contains(element.getHandleIdentifier()))
  // {
  // refresh();
  // fireEvent(new Event(TaskModel.this));
  // break;
  //
  // // ITask task = (ITask)element;
  // // Kind kind = delta.getKind();
  // // System.out.println(kind + ": " + task);
  // //
  // // switch (kind)
  // // {
  // // case ADDED:
  // // taskAdded(task);
  // // break;
  // //
  // // case REMOVED:
  // // case DELETED:
  // // taskRemoved(task);
  // // break;
  // //
  // // case CONTENT:
  // // taskChanged(task);
  // // break;
  // //
  // // case ROOT:
  // // break;
  // // }
  // }
  // }
  // }
  //
  // private synchronized void taskAdded(ITask task)
  // {
  // // logicalTasks.put(task, new LogicalTask(task));
  // }
  //
  // private synchronized void taskRemoved(ITask task)
  // {
  // }
  //
  // private synchronized void taskChanged(ITask task)
  // {
  // }
  // };

  public TaskModel()
  {
    taskDataManager = org.eclipse.mylyn.internal.tasks.ui.TasksUiPlugin.getTaskDataManager();
    taskList = org.eclipse.mylyn.internal.tasks.ui.TasksUiPlugin.getTaskList();
    query = getQuery();
    refresh();
    // taskList.addChangeListener(taskListListener);
  }

  public void dispose()
  {
    // taskList.removeChangeListener(taskListListener);
  }

  public org.eclipse.mylyn.internal.tasks.core.ITaskList getTaskList()
  {
    return taskList;
  }

  public ITaskDataManager getTaskDataManager()
  {
    return taskDataManager;
  }

  public Version[] getVersions()
  {
    return versions;
  }

  public LogicalTask[] getLogicalTasks()
  {
    return logicalTasks;
  }

  public void refresh()
  {
    Map<String, LogicalTask> logicalTasks = new HashMap<String, LogicalTask>();
    Map<Version, Version> versions = new HashMap<Version, Version>();

    for (ITask task : query.getChildren())
    {
      // Activator.getDefault().getLog().log(
      // new Status(IStatus.INFO, Activator.PLUGIN_ID, "Processing task " + task.getTaskId()));

      LogicalTask logicalTask = null;
      VersionTask versionTask = null;

      try
      {
        String summary = task.getSummary();
        logicalTask = logicalTasks.get(summary);
        if (logicalTask == null)
        {
          logicalTask = new LogicalTask(this, summary);
          logicalTasks.put(summary, logicalTask);
        }

        TaskData taskData = taskDataManager.getTaskData(task);
        TaskAttributeMapper attributeMapper = taskData.getAttributeMapper();
        TaskAttribute root = taskData.getRoot();

        TaskAttribute versionAttribute = root.getMappedAttribute(TaskAttribute.VERSION);
        String versionStr = attributeMapper.getValue(versionAttribute);
        Version version = Version.getVersion(versionStr);

        Version existingVersion = versions.get(version);
        if (existingVersion == null)
        {
          versions.put(version, version);
        }
        else
        {
          version = existingVersion;
        }

        TaskAttribute severityAttribute = root.getMappedAttribute(TaskAttribute.SEVERITY);
        String severity = attributeMapper.getValue(severityAttribute);

        TaskAttribute statusAttribute = root.getMappedAttribute(TaskAttribute.STATUS);
        String status = attributeMapper.getValue(statusAttribute);

        TaskAttribute resolutionAttribute = root.getMappedAttribute(TaskAttribute.RESOLUTION);
        String resolution = attributeMapper.getValue(resolutionAttribute);

        versionTask = new VersionTask(logicalTask, task, version, severity, status, resolution);
        logicalTask.getVersionTasks().add(versionTask);

        Activator.getDefault().getLog()
        .log(new Status(IStatus.INFO, Activator.PLUGIN_ID, "Version " + version + " added to task " + logicalTask));
      }
      catch (Exception ex)
      {
        Activator.getDefault().getLog()
        .log(new Status(IStatus.ERROR, Activator.PLUGIN_ID, "Processing task " + task.getTaskId() + " failed", ex));
        ex.printStackTrace();

        // Cleanup
        if (versionTask != null)
        {
          if (logicalTask.getVersionTasks().remove(versionTask))
          {
            if (logicalTask.getVersionTasks().isEmpty())
            {
              logicalTasks.remove(logicalTask.getSummary());
            }
          }
        }
      }
    }

    this.logicalTasks = logicalTasks.values().toArray(new LogicalTask[logicalTasks.size()]);
    Arrays.sort(this.logicalTasks);

    this.versions = versions.keySet().toArray(new Version[versions.size()]);
    Arrays.sort(this.versions);
  }

  private org.eclipse.mylyn.internal.tasks.core.RepositoryQuery getQuery()
  {
    for (org.eclipse.mylyn.internal.tasks.core.RepositoryQuery query : taskList.getQueries())
    {
      String identifier = query.getSummary();
      if (QUERY_IDENTIFIER.equals(identifier))
      {
        return query;
      }
    }

    throw new IllegalStateException("Query 'TaskTable' is missing");
  }
}
