/*
** Copyright 2006, The Android Open Source Project
**
** 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 com.android.calendarcommon2;

import java.util.Calendar;

/**
 * According to RFC2445, durations are like this:
 *       WEEKS
 *     | DAYS [ HOURS [ MINUTES [ SECONDS ] ] ]
 *     | HOURS [ MINUTES [ SECONDS ] ]
 * it doesn't specifically, say, but this sort of implies that you can't have
 * 70 seconds.
 */
public class Duration
{
    public int sign; // 1 or -1
    public int weeks;
    public int days;
    public int hours;
    public int minutes;
    public int seconds;

    public Duration()
    {
        sign = 1;
    }

    /**
     * Parse according to RFC2445 ss4.3.6.  (It's actually a little loose with
     * its parsing, for better or for worse)
     */
    public void parse(String str) throws DateException
    {
        sign = 1;
        weeks = 0;
        days = 0;
        hours = 0;
        minutes = 0;
        seconds = 0;

        int len = str.length();
        int index = 0;
        char c;

        if (len < 1) {
            return ;
        }

        c = str.charAt(0);
        if (c == '-') {
            sign = -1;
            index++;
        }
        else if (c == '+') {
            index++;
        }

        if (len <= index) {
            return ;
        }

        c = str.charAt(index);
        if (c != 'P') {
            throw new DateException (
                    "Duration.parse(str='" + str + "') expected 'P' at index="
                    + index);
        }
        index++;
        if (len <= index) {
            return;
        }
        c = str.charAt(index);
        if (c == 'T') {
            index++;
        }

        int n = 0;
        for (; index < len; index++) {
            c = str.charAt(index);
            if (c >= '0' && c <= '9') {
                n *= 10;
                n += ((int)(c-'0'));
            }
            else if (c == 'W') {
                weeks = n;
                n = 0;
            }
            else if (c == 'H') {
                hours = n;
                n = 0;
            }
            else if (c == 'M') {
                minutes = n;
                n = 0;
            }
            else if (c == 'S') {
                seconds = n;
                n = 0;
            }
            else if (c == 'D') {
                days = n;
                n = 0;
            }
            else if (c == 'T') {
            }
            else {
                throw new DateException (
                        "Duration.parse(str='" + str + "') unexpected char '"
                        + c + "' at index=" + index);
            }
        }
    }

    /**
     * Add this to the calendar provided, in place, in the calendar.
     */
    public void addTo(Calendar cal)
    {
        cal.add(Calendar.DAY_OF_MONTH, sign*weeks*7);
        cal.add(Calendar.DAY_OF_MONTH, sign*days);
        cal.add(Calendar.HOUR, sign*hours);
        cal.add(Calendar.MINUTE, sign*minutes);
        cal.add(Calendar.SECOND, sign*seconds);
    }

    public long addTo(long dt) {
        return dt + getMillis();
    }

    public long getMillis() {
        long factor = 1000 * sign;
        return factor * ((7*24*60*60*weeks)
                + (24*60*60*days)
                + (60*60*hours)
                + (60*minutes)
                + seconds);
    }
}
