/*******************************************************************************
 * Copyright (c) 2007 IBM Corporation and Others
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License v1.0
 * which accompanies this distribution, and is available at
 * http://www.eclipse.org/legal/epl-v10.html
 *
 * Contributors:
 *    Daisuke SATO - initial API and implementation
 *******************************************************************************/
package org.eclipse.actf.ai.audio.description.impl;

import java.util.Locale;

import org.eclipse.actf.ai.audio.description.IMetadata;

public class MetadataImpl implements IMetadata {
	private double scale = 1;

	private String sTime;

	private int type = MASK_SPEAK;

	private int start;

	private int originalTime;

	private int duration;

	private String description;

	private int importance;

	private String lang;

	public MetadataImpl(String start, String duration, String desc,
			String lang, String importance) {
		setStart(start);
		setDuration(duration);
		setLang(lang);
		setDescription(desc);
		setImportance(importance);

	}

	private void setStart(String start) {
		this.start = string2time(start);
		setStringTime();
	}

	private void setDuration(String duration) {
		this.duration = string2time(duration);
	}

	private void setLang(String lang) {
		this.lang = (new Locale(lang)).getLanguage();
	}

	private void setDescription(String desc) {
		this.description = desc;
	}

	private void setImportance(String importance) {
		importance = importance.toLowerCase();
		if (importance.equals("low")) {
			this.importance = IMPORTANCE_LOW;
		} else if (importance.equals("middle")) {
			this.importance = IMPORTANCE_MIDDLE;
		} else if (importance.equals("high")) {
			this.importance = IMPORTANCE_HIGH;
		}
	}

	private int string2time(String str) {
		int time = 0;
		try {
			String[] part = str.split(":");
			int[] r = new int[] { 1, 1000, 60000, 3600000 };

			time = 0;
			for (int i = part.length - 1, j = 0; i >= 0; i--, j++) {
				int temp = Integer.parseInt(part[i]);
				time += temp * r[j];
			}
			time /= 10;
		} catch (Exception e) {
			e.printStackTrace();
			time = 0;
		}
		return time;
	}

	private void setStringTime() {
		int temp = getStartTime();
		int mm = 0;
		int s = 0;
		int m = 0;
		int h = 0;
		mm = temp % 100;
		temp -= mm;
		temp /= 100;
		s = temp % 60;
		temp -= s;
		temp /= 60;
		m = temp % 60;
		temp -= m;
		temp /= 60;
		h = temp;

		StringBuffer sb = new StringBuffer();
		if (h != 0) {
			sb.append(h + "h");
		}
		sb.append((m < 10 ? "0" : "") + m + "m");
		sb.append((s < 10 ? "0" : "") + s + "s");
		sb.append((mm < 10 ? "0" : "") + mm);

		sTime = sb.toString();
	}

	public void setScale(double scale) {
		this.scale = scale;
	}

	public String getDescription() {
		return description;
	}

	public int getStartTime() {
		int temp = start;
		if (temp < 0) {
			temp = 0;
		}
		return (int) (temp * scale);
	}

	public int getType() {
		return type;
	}

	@Override
	public String toString() {
		return start + " (" + duration + ") " + description + ", " + importance;
	}

	public String getStringTime() {
		return sTime;
	}

	public void refresh() {
		start = originalTime;
		setStringTime();
	}

	public int getDuration() {
		return duration;
	}

	public String getLang() {
		return lang;
	}

	public int getImportance() {
		return importance;
	}
}
