package com.tootsville.joshua.server.util;

import java.sql.Date;

import org.starhope.appius.mb.UserEnrolment;
import org.starhope.appius.user.User;

import com.tootsville.gwt.joshua.client.util.Enrolment;
import com.tootsville.user.Toot;

/**
 * 
 * TODO: Document this type. Dec 7, 2009 : theys
 * 
 * @author <a href="mailto:theys@resinteractive.com">Tim Heys</a>
 * 
 */
public class ServerClientTranslator {

	/**
	 * 
	 * TODO: Document this method. Dec 7, 2009 : theys
	 * 
	 * @param users
	 * @return a list of child names
	 */
	private static String [] getChildNameList (final User [] users) {
		final int lengthOfArray = users.length;
		final String [] childrenNames = new String [lengthOfArray];
		for (int i = 0; i < lengthOfArray; i++ ) {
			childrenNames [i] = users [i].getUserName ();
		}
		return childrenNames;
	}

	/**
	 * 
	 * TODO: Document this method. Dec 7, 2009 : theys
	 * 
	 * @param serverParent
	 * @return a client bean of parent object
	 */
	public static com.tootsville.gwt.joshua.client.util.Parent getClientParent (
			final org.starhope.appius.user.Parent serverParent) {
		final com.tootsville.gwt.joshua.client.util.Parent clientParent = new com.tootsville.gwt.joshua.client.util.Parent ();
		clientParent
				.setAnswer (serverParent.getForgotPasswordAnswer ());
		clientParent.setCanContact (serverParent.isCanContact ());
		clientParent.setChildren (ServerClientTranslator
				.getChildNameList (serverParent.getChildren ()));
		clientParent.setDisplayName (serverParent.getDisplayName ());
		clientParent.setGivenName (serverParent.getGivenName ());
		clientParent.setMail (serverParent.getResponsibleMail ());
		clientParent.setPassword (serverParent.getPassword ());
		clientParent.setQuestion (serverParent
				.getForgotPasswordQuestion ());
		clientParent.setUserID (serverParent.getID ());

		return clientParent;
	}

	/**
	 * 
	 * TODO: Document this method. Dec 7, 2009 : theys
	 * 
	 * @param serverUser
	 * @return a client bean of user object
	 */
	public static com.tootsville.gwt.joshua.client.util.User getClientUser (
			final Toot serverUser) {
		if (null == serverUser)
			return null;

		final com.tootsville.gwt.joshua.client.util.User clientUser = new com.tootsville.gwt.joshua.client.util.User ();
		clientUser.setUserID (serverUser.getUserID ());
		clientUser.setDisplayName (serverUser.getDisplayName ());
		clientUser.setUserName (serverUser.getUserName ());
		clientUser.setApproved (serverUser.isApproved ());
		if (!serverUser.hasStaffLevel (1)) {
			clientUser.setPassword (serverUser.getPassword ());
		}
		clientUser.setBasic8 (serverUser.getBasic8Choice ());
		clientUser.setGivenName (serverUser.getGivenName ());
		clientUser.setPaid (serverUser.isPaidMember ());
		clientUser.setBirthDate (String.valueOf (serverUser
				.getBirthDate ()));
		if (!serverUser.hasStaffLevel (1)) {
			clientUser.setQuestion (serverUser
					.getForgotPasswordQuestion ());
			clientUser
					.setAnswer (serverUser.getForgotPasswordAnswer ());
		}
		clientUser.setLastActive (String.valueOf (serverUser
				.getLastActive ()));
		clientUser.setLastZone (serverUser.getLastZone ());
		clientUser.setCanContact (serverUser.isCanContact ());
		clientUser.setStatus (serverUser.isActive () ? "Active"
				: serverUser.isCanceled () ? "Canceled" : serverUser
						.isBanned () ? "Banned" : "void");
		clientUser.setApprovedDate (String.valueOf (serverUser
				.getApprovedDate ()));
		clientUser.setStaffLevel (serverUser.getStaffLevel ());
		clientUser.setAgeGroup (String.valueOf (serverUser
				.getAgeGroup ()));
		clientUser.setMail (serverUser.getResponsibleMail ());
		clientUser.setReferer (serverUser.getReferer ());
		clientUser
				.setBuddyList (serverUser.getBuddyListNamesAsArray ());
		clientUser.setNuts (serverUser.getPeanuts ().toPlainString ());
		clientUser.setUserEnrolments (ServerClientTranslator
				.getUserEnrolments (serverUser.getUserEnrolments ()));
		clientUser.setRegisteredAt (serverUser
				.getRegisteredDateString ());

		return clientUser;
	}

	/**
	 * 
	 * TODO: Document this method. Dec 7, 2009 : theys
	 * 
	 * @param serverPayments
	 * @return client beans for payments
	 */
	private static com.tootsville.gwt.joshua.client.util.Payment getPayments (
			final org.starhope.appius.mb.Payment serverPayments) {
		if (null == serverPayments)
			return null;
		final com.tootsville.gwt.joshua.client.util.Payment clientPayment = new com.tootsville.gwt.joshua.client.util.Payment ();

		clientPayment.setCompleted (serverPayments.isCompleted ());
		clientPayment.setPaid (serverPayments.getPaid ()
				.toPlainString ());
		clientPayment.setPaymentFor (serverPayments.getPaymentFor ());
		clientPayment.setPayer (serverPayments.getPayer ());
		clientPayment.setResultReason (serverPayments
				.getResultReason ());
		clientPayment.setStamp (serverPayments.getStamp ().toString ());
		final String [] annotationNames = serverPayments
				.getAnnotationNames ();
		final String [] annotations = new String [annotationNames.length];
		for (int i = 0; i < annotationNames.length; i++ ) {
			annotations [i] = serverPayments
					.getAnnotation (annotationNames [i]);
		}
		clientPayment.setAnnotations (annotations);

		return clientPayment;
	}

	/**
	 * 
	 * TODO: Document this method. Dec 7, 2009 : theys
	 * 
	 * @param serverEnrolments
	 * @return client beans for user enrolments
	 */
	private static Enrolment [] getUserEnrolments (
			final UserEnrolment [] serverEnrolments) {
		final int lengthOfArray = serverEnrolments.length;
		System.err.println ("Number of enrolments for user: "
				+ lengthOfArray);
		final Enrolment [] clientEnrolments = new Enrolment [lengthOfArray];
		for (int i = 0; i < lengthOfArray; i++ )
			if (null != serverEnrolments [i]) {
				clientEnrolments [i] = new Enrolment ();
				clientEnrolments [i]
						.setOrder_code (serverEnrolments [i]
								.getOrderCode ());
				clientEnrolments [i]
						.setOrder_source (serverEnrolments [i]
								.getOrderSource ());
				if (serverEnrolments [i].getBegins ().before (
						new Date (10000))) {
					clientEnrolments [i].setBegins_at ("N/A");
					clientEnrolments [i].setExpires_at ("N/A");
				} else {
					clientEnrolments [i]
							.setBegins_at (String
									.valueOf (serverEnrolments [i]
											.getBegins ()));
					clientEnrolments [i].setExpires_at (String
							.valueOf (serverEnrolments [i]
									.getExpires ()));
				}
				clientEnrolments [i]
						.setProduct_id (String
								.valueOf (serverEnrolments [i]
										.getProductID ()));
				clientEnrolments [i]
						.setAuth_sub_id (String
								.valueOf (serverEnrolments [i]
										.getAuthSubID ()));
				clientEnrolments [i]
						.setProduct_title (serverEnrolments [i]
								.getEnrolment ().getTitle ());
				clientEnrolments [i]
						.setExpired (serverEnrolments [i].getExpires ()
								.before (
										new Date (System
												.currentTimeMillis ())));
				try {
					clientEnrolments [i]
							.setPayment (ServerClientTranslator
									.getPayments (serverEnrolments [i]
											.getLastPayment ()));
				} catch (final Exception e) {
					System.err
							.println ("Cannot find a payment for invoice #"
									+ serverEnrolments [i]
											.getInvoiceID ());
					clientEnrolments [i].setPayment (null);
				}
			} else {
				System.err
						.println ("Failed to propagate an enrolment because it was null.");
			}
		return clientEnrolments;
	}
}
