package org.fluxtream.core.mvc.models;
import java.util.Calendar;
import java.util.TimeZone;
import javax.xml.bind.DatatypeConverter;
import org.fluxtream.core.Configuration;
import org.fluxtream.core.domain.metadata.City;
import org.fluxtream.core.domain.metadata.VisitedCity;
import org.fluxtream.core.utils.TimeUtils;
import org.apache.commons.lang.WordUtils;
import org.codehaus.plexus.util.StringUtils;
import org.joda.time.DateTime;
import org.joda.time.DateTimeConstants;
import org.joda.time.DateTimeZone;
import org.joda.time.format.DateTimeFormat;
import org.joda.time.format.DateTimeFormatter;
/**
* User: candide
* Date: 27/05/13
* Time: 15:14
*/
public class VisitedCityModel {
public String source;
public String name;
public String state;
public String country;
public String description;
public String timezone;
public String shortTimezone;
public long visitedCityId;
int startMinute, endMinute;
String date;
String dateWithTimezone;
String startTime, endTime;
long dayStart, dayEnd;
long count;
int daysInferred;
int tzOffset;
double longitude, latitude;
static final DateTimeFormatter fmt = DateTimeFormat.forPattern("MMM dd, HH:mm' 'a");
public DurationModel duration;
public VisitedCityModel(VisitedCity vcity, Configuration env) {
this(vcity,env,vcity.date);
}
public VisitedCityModel(VisitedCity vcity, Configuration env, String date){
this.visitedCityId = vcity.getId();
this.daysInferred = vcity.daysInferred;
this.date = date;
source = vcity.locationSource.toString();
City city = vcity.city;
name = city.geo_name;
country = env.getCountry(city.geo_country_code);
if (country == null)
return;
country = WordUtils.capitalize(country.toLowerCase());
state = city.geo_admin1_code;
if (state == null || state.equals(""))
state = "-";
description = city.geo_name;
if ("US".equals(city.geo_country_code))
description = city.geo_name + "/" + state + "/" + country;
else
description = city.geo_name + "/" + country;
duration = new DurationModel((int)(vcity.end - vcity.start)/1000);
Calendar c = Calendar.getInstance(TimeZone.getTimeZone(vcity.city.geo_timezone));
c.setTimeInMillis(vcity.start);
this.startMinute = c.get(Calendar.HOUR_OF_DAY)*60 + c.get(Calendar.MINUTE);
c.setTimeInMillis(vcity.end);
this.endMinute = c.get(Calendar.HOUR_OF_DAY)*60 + c.get(Calendar.MINUTE);
this.count = vcity.count;
DateTimeZone tz = DateTimeZone.forID(vcity.city.geo_timezone);
timezone = tz.getName(DateTime.parse(this.date).getMillis());
shortTimezone = tz.getShortName(DateTime.parse(this.date).getMillis());
Calendar calendar = DatatypeConverter.parseDateTime(vcity.startTimeStorage);
this.startTime = StringUtils.capitalise(fmt.print(calendar.getTimeInMillis()).toLowerCase());
calendar = DatatypeConverter.parseDateTime(vcity.endTimeStorage);
this.endTime = StringUtils.capitalise(fmt.print(calendar.getTimeInMillis()).toLowerCase());
this.dayStart = TimeUtils.dateFormatter.withZone(tz).parseDateTime(this.date).getMillis();
this.dayEnd = dayStart + DateTimeConstants.MILLIS_PER_DAY;
tzOffset = tz.getOffset(dayStart);
this.latitude = city.geo_latitude;
this.longitude = city.geo_longitude;
this.dateWithTimezone = this.date + " " + this.shortTimezone;
}
}