/* 
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you 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.apache.felix.upnp.sample.clock;

import java.util.Calendar;
/* 
* @author <a href="mailto:dev@felix.apache.org">Felix Project Team</a>
*/

public class Clock
{
	private Calendar cal;

	public Clock(Calendar cal)
	{
		this.cal = cal;
	}

	public Calendar getCalendar()
	{
		return cal;
	}

	////////////////////////////////////////////////
	//	Time
	////////////////////////////////////////////////

	public int getHour()
	{
		return getCalendar().get(Calendar.HOUR);
	}

	public int getMinute()
	{
		return getCalendar().get(Calendar.MINUTE);
	}

	public int getSecond()
	{
		return getCalendar().get(Calendar.SECOND);
	}
	
	////////////////////////////////////////////////
	//	paint
	////////////////////////////////////////////////

	public final static Clock getInstance()
	{
		return new Clock(Calendar.getInstance());
	}

	////////////////////////////////////////////////
	//	getDateString
	////////////////////////////////////////////////

	public final static String toClockString(int value)
	{
		if (value < 10)
			return "0" + Integer.toString(value);
		return Integer.toString(value);
	}

	private final static String MONTH_STRING[] = {
		"Jan",
		"Feb",
		"Mar",
		"Apr",
		"May",
		"Jun",
		"Jul",
		"Aug",
		"Sep",
		"Oct",
		"Nov",
		"Dec",
	};

	public final static String toMonthString(int value)
	{
		value -= Calendar.JANUARY;
		if (0 <= value && value < 12)
			return MONTH_STRING[value];
		return "";
	}
	
	private final static String WEEK_STRING[] = {
		"Sun",
		"Mon",
		"Tue",
		"Wed",
		"Thu",
		"Fri",
		"Sat",
	};

	public final static String toWeekString(int value)
	{
		value -= Calendar.SUNDAY;
		if (0 <= value && value < 7)
			return WEEK_STRING[value];
		return "";
	}
	
	public String getDateString()
	{
		Calendar cal = getCalendar();
		return
			toWeekString(cal.get(Calendar.DAY_OF_WEEK)) +", " + 
			toMonthString(cal.get(Calendar.MONTH)) + " " +
			Integer.toString(cal.get(Calendar.DATE)) + ", " +
			toClockString(cal.get(Calendar.YEAR) % 100);
	}

	////////////////////////////////////////////////
	//	getTimeString
	////////////////////////////////////////////////
	
	public String getTimeString()
	{
		Calendar cal = getCalendar();
		return
			toClockString(cal.get(Calendar.HOUR)) +
			(((cal.get(Calendar.SECOND) % 2) == 0) ? ":" : " ") +
			toClockString(cal.get(Calendar.MINUTE));
	}

	////////////////////////////////////////////////
	//	toString
	////////////////////////////////////////////////

	public String toString()
	{
		Calendar cal = getCalendar();
		return
			getDateString() + ", " +
			toClockString(cal.get(Calendar.HOUR)) + ":" +
			toClockString(cal.get(Calendar.MINUTE)) + ":" +
			toClockString(cal.get(Calendar.SECOND));
	}
		
}

