/*
 * Copyright 2012 s_wolff.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package org.aegee.runanddine.feedback;

import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;
import java.util.List;

import org.aegee.runanddine.FrontendBasePage;
import org.aegee.runanddine.archive.ArchiveEntry;
import org.aegee.runanddine.archive.ArchiveEntryManager;
import org.aegee.runanddine.registration.GroupRegistration;
import org.aegee.runanddine.registration.GroupRegistrationManager;
import org.aegee.runanddine.registration.SingleRegistration;
import org.aegee.runanddine.registration.SingleRegistrationManager;
import org.aegee.runanddine.runanddine.RDManager;
import org.aegee.runanddine.runanddine.RunAndDine;
import org.aegee.runanddine.util.data.ModelNotExistingException;
import org.aegee.runanddine.util.forms.DynamicForm;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.wicket.behavior.AttributeAppender;
import org.apache.wicket.markup.html.WebMarkupContainer;
import org.apache.wicket.markup.html.panel.FeedbackPanel;
import org.apache.wicket.request.http.flow.AbortWithHttpErrorCodeException;
import org.apache.wicket.request.mapper.parameter.PageParameters;

/**
 * Editor page for feedback from participants
 * 
 * @author s_wolff
 */
public class FeedbackEditor extends FrontendBasePage
{
	private static final long serialVersionUID = 1L;

	private static final Log LOG = LogFactory.getLog(FeedbackEditor.class);

	/**
	 * Page constructor with page parameters
	 * 
	 * @param parameters
	 *            HTTP parameters
	 */
	public FeedbackEditor(PageParameters parameters)
	{
		super(parameters);

		final String providedToken = parameters.get("token").toString();
		final int providedId = parameters.get("id").toInt();
		boolean notFound = true;
		boolean tooLate = false;

		Date now = new Date();
		Calendar cal = new GregorianCalendar();
		RunAndDine run = null;
		try
		{
			run = RDManager.getInstance().getById(providedId);
		}
		catch (ModelNotExistingException ex)
		{
			LOG.error("ModelNotExistingException");
			throw new AbortWithHttpErrorCodeException(404);
		}
		cal.setTime(run.getDate());
		cal.add(Calendar.MONTH, 1);
		Date feedbackDeadline = cal.getTime();

		final WebMarkupContainer feedbackContainer = new WebMarkupContainer("feedbackContainer")
		{

			@Override
			protected void onBeforeRender()
			{
				super.onBeforeRender();

				if (this.hasErrorMessage())
				{
					this.setVisible(true);
					this.add(new AttributeAppender("class", "box error"));
				}
				else if (this.hasFeedbackMessage())
				{
					this.setVisible(true);
					this.add(new AttributeAppender("class", "box success"));
				}
			}
		};
		feedbackContainer.add(new FeedbackPanel("feedback"));
		add(feedbackContainer);
		final String emailAdress;
		final ArchiveEntry entry = new ArchiveEntry();

		if (now.after(feedbackDeadline))
		{
			tooLate = true;
			emailAdress = "";
		}
		else
		{
			SingleRegistration mySingleReg = null;
			GroupRegistration myGroupReg = null;

			try
			{
				mySingleReg = SingleRegistrationManager.getInstance().getByValidationToken(providedToken);
			}
			catch (ModelNotExistingException e)
			{
				// TODO: tell user that a wrong token was provided
			}
			try
			{
				myGroupReg = GroupRegistrationManager.getInstance().getByValidationToken(providedToken);
			}
			catch (ModelNotExistingException e)
			{
				// TODO: tell user that a wrong token was provided
			}

			if (mySingleReg != null)
			{
				entry.setFirstname(mySingleReg.getFirstName());
				entry.setLastname(mySingleReg.getLastName());
				entry.setEmail(mySingleReg.getEmail());
				emailAdress = mySingleReg.getEmail();
				entry.setAegeeMailFlag(false); // initialize with false
				entry.setRadMailFlag(false); // initialize with false
				notFound = false;
			}
			else if (myGroupReg != null && myGroupReg.getValidationToken1().equals(providedToken))
			{
				entry.setFirstname(myGroupReg.getFirstName1());
				entry.setLastname(myGroupReg.getLastName1());
				entry.setEmail(myGroupReg.getEmail1());
				emailAdress = myGroupReg.getEmail1();
				entry.setAegeeMailFlag(false); // initialize with false
				entry.setRadMailFlag(false); // initialize with false
				notFound = false;
			}
			else if (myGroupReg != null && myGroupReg.getValidationToken2().equals(providedToken))
			{
				entry.setFirstname(myGroupReg.getFirstName2());
				entry.setLastname(myGroupReg.getLastName2());
				entry.setEmail(myGroupReg.getEmail2());
				emailAdress = myGroupReg.getEmail2();
				entry.setAegeeMailFlag(false); // initialize with false
				entry.setRadMailFlag(false); // initialize with false
				notFound = false;
			}
			else
			{
				emailAdress = "";
			}
		}

		final Feedback myFeedback = new Feedback();
		final DynamicForm form = new DynamicForm("editor")
		{

			@Override
			protected void onSubmit()
			{
				myFeedback.setRunAndDineId(providedId);
				FeedbackManager.getInstance().save(myFeedback);

				ArchiveEntry oldEntry = null;
				List<ArchiveEntry> archiveList = ArchiveEntryManager.getInstance().getAll();
				for (ArchiveEntry archive : archiveList)
				{
					if (emailAdress.equals(archive.getEmail()))
					{
						oldEntry = archive;
						break;
					}
				}
				if (oldEntry != null)
				{
					oldEntry.setRadMailFlag(myFeedback.isRadMailFlag());
					oldEntry.setAegeeMailFlag(myFeedback.isAegeeMailFlag());
					ArchiveEntryManager.getInstance().save(oldEntry);
				}
				else
				{
					entry.setRadMailFlag(myFeedback.isRadMailFlag());
					entry.setAegeeMailFlag(myFeedback.isAegeeMailFlag());
					ArchiveEntryManager.getInstance().save(entry);
				}
				feedbackContainer.info("Thank you for giving us feedback. We hope to see you on our next event!");
				feedbackContainer.setVisible(true);
			}
		};
		if (notFound)
		{
			feedbackContainer.error("That was a wrong feedbacklink. Please try it again!");
			form.setVisible(false);
		}
		else if (tooLate)
		{
			feedbackContainer.error("Sorry you missed the feedback deadline. Please contact the organizer directly ");
			form.setVisible(false);
		}
		else
		{
			feedbackContainer.setVisible(false);
			form.addHeadline("On scale from 1 (bad) till 10 (good):");
			List<Integer> scale = new ArrayList<Integer>();
			for (int n = 0; n < 11; n++)
			{
				scale.add(n);
			}

			form.addSelection(myFeedback, scale, "pointsRaD", "How did you like the Run&Dine?", true);
			form.addSelection(myFeedback, scale, "pointsMotto", "How did you like the motto?", true);

			// A very stupid solution with YesNoChice instead of a CheckboxChoice
			form.addHeadline("How did you learn about the Run & Dine Event?");
			form.addYesNoChoice(myFeedback, "advMail", "Mail:", false);
			form.addYesNoChoice(myFeedback, "advCanteen", "Flyer in canteen:", false);
			form.addYesNoChoice(myFeedback, "advFacebook", "Facebook:", false);
			form.addYesNoChoice(myFeedback, "advFriends", "Friends:", false);
			form.addTextField(myFeedback, "otherAdv", "Others", false);
			form.addHeadline("Which ways of information for university events do you like and use?");
			form.addYesNoChoice(myFeedback, "advMailWish", "Mail:", false);
			form.addYesNoChoice(myFeedback, "advCanteenWish", "Flyer in canteen:", false);
			form.addYesNoChoice(myFeedback, "advFacebookWish", "Facebook:", false);
			form.addYesNoChoice(myFeedback, "advFriendsWish", "Friends:", false);
			form.addTextField(myFeedback, "otherWish", "Others:", false);
			form.addHeadline("Give us additional feedback and ideas for future events.");
			form.addTextArea(myFeedback, "additionalFeedback", "What do you want to say?", false);
			form.addHeadline("Do you want advertisement mails ....");
			form.addYesNoChoice(myFeedback, "radMailFlag", "for future Run&Dines?", true);
			form.addYesNoChoice(myFeedback, "aegeeMailFlag", "for other AEGEE-Events?", true);
			form.addSubmitButton("Send feedback");
		}
		this.add(form);
	}
}