/////////////////////////////////////////////////////////////////
//Copyright (C) 2005 NTT CORPORATION.
//
//	期間クラス
//
//		変更履歴
//			2005.02.16  新規作成  Katsuhiko.Sakurai(UNITEC)
//
//	機能
//
//	このクラスは期間クラスです。
//
////////////////////////////////////////////////////////////////
package jp.co.ntt.lms.lo.progress.util;

import java.text.MessageFormat;

import jp.co.ntt.lms.xmo.util.DebugLog;


/**
 * 期間クラスです。
 * 
 * @author Katsuhiko Sakurai (UNITEC)
 * @version 1.0
 */
public class TimeSpan {
	
	private int years = 0;
	private int months = 0;
	private int days =0;
	private int hours = 0;
	private int minutes = 0;
	private int seconds = 0;
	
	/**
	 * コンストラクタです。
	 * 
	 */
	public TimeSpan(){}
	
	/**
	 * コンストラクタです。
	 * 
	 * @param years 年数
	 * @param months 月数
	 * @param days 日数
	 * @param hours 時間数
	 * @param minutes 分数
	 * @param seconds 秒数
	 */
	public TimeSpan(int years, int months, int days, int hours, int minutes, int seconds) {
		this.years = years;
		this.months = months;
		this.days = days;
		this.hours = hours;
		this.minutes = minutes;
		this.seconds = seconds;
	}
	
	/**
	 * 日数を取得します。
	 * 
	 * @return int 日数
	 */
	public int getDays() {
		return this.days;
	}

	/**
	 * 日数を設定します。
	 * 
	 * @param days 日数
	 */
	public void setDays(int days) {
		this.days = days;
	}

	/**
	 * 時間数を取得します。
	 * 
	 * @return int 時間数
	 */
	public int getHours() {
		return this.hours;
	}
	
	/**
	 * 時間数を設定します。
	 * 
	 * @param hours 時間数
	 */
	public void setHours(int hours) {
		this.hours = hours;
	}

	/**
	 * 分数を取得します。
	 * 
	 * @return int 分数
	 */
	public int getMinutes() {
		return this.minutes;
	}
	
	/**
	 * 分数を設定します。
	 * 
	 * @param minutes 分数
	 */
	public void setMinutes(int minutes) {
		this.minutes = minutes;
	}

	/**
	 * 月数を取得します。
	 * 
	 * @return int 月数
	 */
	public int getMonths() {
		return this.months;
	}
	
	/**
	 * 月数を設定します。
	 * 
	 * @param months 月数
	 */
	public void setMonths(int months) {
		this.months = months;
	}

	/**
	 * 秒数を取得します。
	 * 
	 * @return int 秒数
	 */
	public int getSeconds() {
		return this.seconds;
	}

	/**
	 * 秒数を設定します。
	 * 
	 * @param seconds 秒数
	 */
	public void setSeconds(int seconds) {
		this.seconds = seconds;
	}

	/**
	 * 年数を取得します。
	 * 
	 * @return int 年数
	 */
	public int getYears() {
		return this.years;
	}

	/**
	 * 年数を設定します。
	 * 
	 * @param years 年数
	 */
	public void setYears(int years) {
		this.years = years;
	}

	/**
	 * 指定された文字列を期間に変換します。
	 * 
	 * @param iso8601String ISO8601形式の期間を表す文字列
	 * @return TimeSpan 期間
	 * @throws Exception
	 */
	public static TimeSpan parseTimeSpan(String iso8601String) throws Exception {

		String years = "0000";
		String months = "00";
		String days = "00";
		String hours = "00";
		String minutes = "00";
		String seconds = "00";
		
		// 中身を取り出す
		String[] durationStringSplit = iso8601String.split("P");
		if (durationStringSplit.length < 2) return null;
		
		String contents = durationStringSplit[1];
		
		// 形式ごとにフォーマット変換
		// ●　P1Y2M3DT4H5M6S 形式
		if ( contents.matches(".*(Y|M|D|H|S).*") ) {
			
			// 日付部と時間部を分割
			String[] splitString = contents.split("T");
			String datePart = splitString[0];
			String timePart = "";
			if (splitString.length > 1) {
				timePart = splitString[1];
			}
			
			// 日付部の処理
			// 年数
			if (datePart.indexOf("Y") > 0) {
				years = datePart.substring(0, datePart.indexOf("Y"));
				datePart = datePart.substring(datePart.indexOf("Y")+1);
			}
			
			// 月数
			if (datePart.indexOf("M") > 0) {
				months = datePart.substring(0, datePart.indexOf("M"));
				datePart = datePart.substring(datePart.indexOf("M")+1);
			}
			
			// 日数
			if (datePart.indexOf("D") > 0) {
				days = datePart.substring(0, datePart.indexOf("D"));
			}
			
			// 時間部の処理
			if (timePart.length() > 0) {
			
				// 時間数
				if (timePart.indexOf("H") > 0) {
					hours = timePart.substring(0, timePart.indexOf("H"));
					timePart = timePart.substring(timePart.indexOf("H")+1);
				}
				
				// 分数
				if (timePart.indexOf("M") > 0) {
					minutes = timePart.substring(0, timePart.indexOf("M"));
					timePart = timePart.substring(timePart.indexOf("M")+1);
				}
				
				// 秒数
				if (timePart.indexOf("S") > 0) {
					seconds = timePart.substring(0, timePart.indexOf("S"));
				}
			}
			
		// ●　P0001-12-04T10:10:10 形式
		} else if ( contents.matches(".*(-|:).*")) {

			// 日付部と時間部を分割
			String[] splitString = contents.split("T");
			String datePart = splitString[0];
			String timePart = "";
			if (splitString.length > 1) {
				timePart = splitString[1];
			}
			
			// 日付部の処理
			String[] splitDatePart = datePart.split("-");
			
			switch (splitDatePart.length) {
			case 3:
				years = splitDatePart[0];
				months = splitDatePart[1];
				days = splitDatePart[2];
				break;
				
			case 2:
				years = splitDatePart[0];
				months = splitDatePart[1];
				break;
				
			default:
				break;
			} 
			
			// 時間部の処理
			if (timePart.length() > 0) {
			
				String[] splitTimePart = timePart.split(":");
				
				switch (splitTimePart.length) {
				case 3:
					hours = splitTimePart[0];
					minutes = splitTimePart[1];
					seconds = splitTimePart[2];
					break;
					
				case 2:
					hours = splitTimePart[0];
					minutes = splitTimePart[1];
					break;
					
				default:
					break;
				} 
			}
			
		
		// ●　P00011204T101010 形式
		} else {

			// 日付部と時間部を分割
			String[] splitString = contents.split("T");
			String datePart = splitString[0];
			String timePart = "";
			if (splitString.length > 1) {
				timePart = splitString[1];
			}
			
			if(datePart.length() == 8) {
				years = datePart.substring(0, 4);
				months = datePart.substring(4, 6);
				days = datePart.substring(6, 8);

			} else if(datePart.length() == 6) {
				years = datePart.substring(0, 2);
				months = datePart.substring(2, 4);
				days = datePart.substring(4, 6);
			} 

			if (timePart.length() > 0) {
				hours = timePart.substring(0, 2);
				minutes = timePart.substring(2, 4);
				seconds = timePart.substring(4, 6);
			}
		}
		
		// 変換した期間を表す文字列
		final String convertedDateString = 
					MessageFormat.format("{0}-{1}-{2}T{3}:{4}:{5}",
							new String[]{years, months, days, hours, minutes, seconds});
	
		DebugLog.write(TimeSpan.class,"変換後の学習期間:" + convertedDateString, DebugLog.ROW);
		
		return new TimeSpan(Integer.parseInt(years),
								Integer.parseInt(months), 
								Integer.parseInt(days), 
								Integer.parseInt(hours), 
								Integer.parseInt(minutes), 
								Integer.parseInt(seconds));
	}
	
}
