/**
 * Parses and formats the given date-time string representation.
 *
 * The format assumed is "YYYY-MM-DDTHH:MM:SS".
 *
 * @param dateTimeString A string expressing a date and a time, in the above mentioned format.
 * @returns {string} A human-friendly string version of that date and time.
 */
export function parseAndFormatDateTime(dateTimeString) {
    return formatDateTime(parseDateTime(dateTimeString))
}

/**
 * Parses date-time string representations and returns a parsed object.
 *
 * The format assumed is "YYYY-MM-DDTHH:MM:SS".
 *
 * @param dateTimeString A string expressing a date and a time, in the above mentioned format.
 * @returns {object} A Date object with the parsed date and time information as content.
 */
export function parseDateTime(dateTimeString) {
    return new Date(dateTimeString + '.000Z')
}

/**
 * Serializes the given date and time value to a human-friendly string.
 *
 * @param dateTime An object representation of a date and time.
 * @returns {string} A human-friendly string version of that date and time.
 */
export function formatDateTime(dateTime) {
    let date
    const currentDate = new Date()

    date =
        addPaddingToTwo(dateTime.getDay()) +
        '/' +
        addPaddingToTwo(dateTime.getMonth()) +
        '/' +
        addPaddingToTwo(dateTime.getFullYear())

    if (dateTime.getFullYear() === currentDate.getFullYear() && dateTime.getMonth() === currentDate.getMonth()) {
        if (dateTime.getDate() === currentDate.getDate()) {
            date = 'Today'
        } else if (dateTime.getDate() === currentDate.getDate() - 1) {
            date = 'Yesterday'
        }
    }

    return date + ', ' + addPaddingToTwo(dateTime.getHours()) + ':' + addPaddingToTwo(dateTime.getMinutes())
}

/**
 * Formats the given number of seconds/ticks to a formatted time representation.
 *
 * @param seconds The number of seconds.
 * @returns {string} A string representation of that amount of second, in the from of HH:MM:SS.
 */
export function convertSecondsToFormattedTime(seconds) {
    if (seconds <= 0) {
        return '0s'
    }

    let hour = Math.floor(seconds / 3600)
    let minute = Math.floor(seconds / 60) % 60
    let second = seconds % 60

    hour = isNaN(hour) ? 0 : hour
    minute = isNaN(minute) ? 0 : minute
    second = isNaN(second) ? 0 : second

    if (hour === 0 && minute === 0) {
        return second + 's'
    } else if (hour === 0) {
        return minute + 'm' + addPaddingToTwo(second) + 's'
    } else {
        return hour + 'h' + addPaddingToTwo(minute) + 'm' + addPaddingToTwo(second) + 's'
    }
}

/**
 * Pads the given integer to have at least two digits.
 *
 * @param integer An integer to be padded.
 * @returns {string} A string containing the padded integer.
 */
function addPaddingToTwo(integer) {
    if (integer < 10) {
        return '0' + integer.toString()
    } else {
        return integer.toString()
    }
}
