/*
 *   Copyright 2011 Brian Rosenberger (Brutex Network)
 *
 *   Licensed 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 net.brutex.xservices.types;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Locale;
import java.util.TimeZone;

import javax.xml.bind.annotation.XmlEnum;
import javax.xml.bind.annotation.XmlEnumValue;
import javax.xml.bind.annotation.XmlType;

import net.brutex.xservices.util.BrutexNamespaces;

/**
 * Different pre-defined date formats.
 *
 * @author Brian Rosenberger, bru@brutex.de
 */
@XmlEnum()
public enum DateFormatType {

    /**
     * ISO 8601 format (2011-05-24T14:39+01:00)
     */
	@XmlEnumValue("ISO 8601")
    ISO8601("ISO 8601", "yyyy-MM-dd'T'HH:mm:ss.SSSZ"),
    /**
     * RFC822 format (2011-05-24T14:39+0100)
     */
    @XmlEnumValue("RFC 822")
    RFC822("RFC 822", "yyyy-MM-dd'T'HH:mm:ss.SSSZ"),
    /**
     * yyyy/mm/dd
     */
    @XmlEnumValue("DateOnly-slashed")
    YYYYMMDD("DateOnly-slashed", "yyyy/MM/dd"),
    
    /**
     * dd.mm.yyyy
     */
    @XmlEnumValue("DateOnly-dotted")
    DDMMYYYY("DateOnly-dotted", "dd.MM.yyyy"),
    
	/**
     * dd.mm.yyyy
     */
    @XmlEnumValue("DateOnly-dashed")
    DDMMYYYYdashed("DateOnly-dashed", "dd-MM-yyyy");
    
    private String value;
    private String format;
    
    DateFormatType(String value, String format) {
        this.value = value;
        this.format = format;
    }

    /**
     * Return the value of the enum.
     * @return  String representation of the mime type
     */
    public String value() {
        return value;
    }
    
    public String format(Date date, Locale locale, TimeZone timezone) {
    	if(date==null) return "";
    	if(locale==null) locale = Locale.getDefault();
    	if(timezone==null) timezone = TimeZone.getDefault();
    	String result = "";
    	SimpleDateFormat f;
    	if(this.equals(ISO8601)) {
    		//apply ISO8061 hack
    		f = new SimpleDateFormat(RFC822.format, locale);
    		f.setTimeZone(timezone);
    		result = f.format(date);
    		result = result.substring(0, 26) + ":" + result.substring(26);
    	} else {
        	f = new SimpleDateFormat(this.format, locale);
        	f.setTimeZone(timezone);
    		result = f.format(date);
    	}
    	return result;
    }
    
    public Date parse(String s, Locale locale, TimeZone timezone)
    	throws ParseException {
    	if(locale==null) locale = Locale.getDefault();
    	if(timezone==null) timezone = TimeZone.getDefault();
    	SimpleDateFormat fin = new SimpleDateFormat(this.format, locale);
    	fin.setTimeZone(timezone);
    	Date date = fin.parse(s);
    	return date;    
    }
}
