/*
 * Copyright (C) 2010 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 vogar.util;

/**
 * Utilities to make it easier to work with ISO 8601 dates and times.
 * This is a subset of the original class from http://software.jessies.org/salma-hayek/ --- please submit fixes upstream.
 */
public class TimeUtilities {
    /**
     * Returns the ISO 8601-format String corresponding to the given duration (measured in milliseconds).
     */
    public static String msToIsoString(long duration) {
        long milliseconds = duration % 1000;
        duration /= 1000;
        long seconds = duration % 60;
        duration /= 60;
        long minutes = duration % 60;
        duration /= 60;
        long hours = duration;

        StringBuilder result = new StringBuilder("P");
        if (hours != 0) {
            result.append(hours);
            result.append('H');
        }
        if (result.length() > 1 || minutes != 0) {
            result.append(minutes);
            result.append('M');
        }
        result.append(seconds);
        if (milliseconds != 0) {
            result.append('.');
            result.append(milliseconds);
        }
        result.append('S');
        return result.toString();
    }
    
    /**
     * Returns a string representation of the given number of milliseconds.
     */
    public static String msToString(long ms) {
        return nsToString(ms * 1000000);
    }
    
    /**
     * Returns a string representation of the given number of nanoseconds.
     */
    public static String nsToString(long ns) {
        if (ns < 1000L) {
            return Long.toString(ns) + "ns";
        } else if (ns < 1000000L) {
            return Long.toString(ns/1000L) + "us";
        } else if (ns < 1000000000L) {
            return Long.toString(ns/1000000L) + "ms";
        } else if (ns < 60000000000L) {
            return String.format("%.2fs", nsToS(ns));
        } else {
            long duration = ns;
            long nanoseconds = duration % 1000;
            duration /= 1000;
            long microseconds = duration % 1000;
            duration /= 1000;
            long milliseconds = duration % 1000;
            duration /= 1000;
            long seconds = duration % 60;
            duration /= 60;
            long minutes = duration % 60;
            duration /= 60;
            long hours = duration % 24;
            duration /= 24;
            long days = duration;
            
            StringBuilder result = new StringBuilder();
            if (days != 0) {
                result.append(days);
                result.append('d');
            }
            if (result.length() > 1 || hours != 0) {
                result.append(hours);
                result.append('h');
            }
            if (result.length() > 1 || minutes != 0) {
                result.append(minutes);
                result.append('m');
            }
            result.append(seconds);
            result.append('s');
            return result.toString();
        }
    }
    
    /**
     * Converts nanoseconds into (fractional) seconds.
     */
    public static double nsToS(long ns) {
        return ((double) ns)/1000000000.0;
    }

    private TimeUtilities() {
    }
}