/*******************************************************************************
 * Copyright (c) 2004, 2008 Tasktop Technologies 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:
 *     Tasktop Technologies - initial API and implementation
 *******************************************************************************/

package org.eclipse.mylyn.examples.monitor.study;

import java.io.File;
import java.util.Calendar;

import org.eclipse.core.runtime.NullProgressMonitor;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.wizard.Wizard;
import org.eclipse.mylyn.commons.core.DateUtil;
import org.eclipse.mylyn.internal.monitor.usage.StudyParameters;
import org.eclipse.mylyn.internal.monitor.usage.UiUsageMonitorPlugin;
import org.eclipse.mylyn.internal.monitor.usage.wizards.UsageSubmissionWizard;
import org.eclipse.ui.INewWizard;
import org.eclipse.ui.IWorkbench;
import org.eclipse.ui.plugin.AbstractUIPlugin;

/**
 * A wizard for uploading the Mylyn statistics to a website
 * 
 * @author Shawn Minto
 * @author Mik Kersten
 */
public class FeedbackWizard extends Wizard implements INewWizard {

	private final SubmitFeedbackPage feedbackPage;

	private final StudyParameters studyParameters;

	/**
	 * Constructor for SampleNewWizard.
	 */
	public FeedbackWizard(UsageSubmissionWizard wizard) {
		super();
		studyParameters = UiUsageMonitorPlugin.getDefault().getStudyParameters();

		setNeedsProgressMonitor(true);
		super.setDefaultPageImageDescriptor(AbstractUIPlugin.imageDescriptorFromPlugin(UiUsageMonitorPlugin.ID_PLUGIN,
				"icons/wizban/banner-user.gif"));
		super.setWindowTitle(studyParameters.getStudyName() + " Feedback");
		feedbackPage = new SubmitFeedbackPage(wizard, studyParameters);
	}

	public FeedbackWizard() {
		this(null);
	}

	@Override
	public boolean performFinish() {
		File f = feedbackPage.createFeedbackFile();
		if (f == null) {
			return true;
		}
		// FIXME!!!!!!!!!!!!!!!!!!

		String uploadScript;

		// XXX: unimplemented
		uploadScript = "<unimplemented>";
		// uploadScript =
		// MylynUsageMonitorPlugin.getDefault().getStudyParameters().getScriptsUrl()
		// +
		// MylynUsageMonitorPlugin.getDefault().getStudyParameters().getScriptsQuestionnaire();

		int uid = feedbackPage.getUid();
		UiUsageMonitorPlugin.getDefault().getUploadManager().uploadFile(
				uploadScript,
				"MYLYN" + uid,
				f,
				studyParameters.getUploadFileLabel() + "-" + studyParameters.getVersion() + "-" + "feedback" + "-"
						+ uid + "-" + DateUtil.getIsoFormattedDateTime(Calendar.getInstance()) + ".txt", uid,
				new NullProgressMonitor());
		if (f.exists()) {
			f.delete();
		}
		return true;
	}

	/**
	 * @see org.eclipse.ui.IWorkbenchWizard#init(org.eclipse.ui.IWorkbench,
	 *      org.eclipse.jface.viewers.IStructuredSelection)
	 */
	public void init(IWorkbench workbench, IStructuredSelection selection) {
		// don't need to do any initialization
	}

	@Override
	public void addPages() {
		addPage(feedbackPage);
	}
}
