/*
Sailfin: a Jellyfin client written using Qt
Copyright (C) 2020 Chris Josten

This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 of the License, or (at your option) any later version.

This library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
Lesser General Public License for more details.

You should have received a copy of the GNU Lesser General Public
License along with this library; if not, write to the Free Software
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
*/

.pragma library

/**
 * Converts miliseconds to a h:mm:ss format
 */
function timeToText(time, showHours) {
    var mShowHours = showHours === undefined ? true : showHours
    if (time < 0) return "??:??:??"
    var hours = Math.floor(time / (60 * 60 * 1000))
    var left = time % (60 * 60 * 1000)
    var minutes = Math.floor(left / (60 * 1000))
    left = time % (60 * 1000)
    var seconds = Math.floor(left / 1000)
    return (hours > 0 ? hours + ":" : "")
            + (minutes < 10 ? "0" : "")
            + minutes + ":" + (seconds < 10 ? "0" : "")+ seconds
}

function msToTicks(ms) {
    return ms * 10000;
}

function ticksToMs(ticks) {
    return ticks / 10000;
}

function ticksToText(ticks, showHours) {
    return timeToText(ticks / 10000, showHours);
}

function itemImageUrl(baseUrl, item, type, options) {
    if (item === null || !item.imageTags[type]) { return "" }
    return itemModelImageUrl(baseUrl, item.jellyfinId, item.imageTags[type], type, options)
}

function itemModelImageUrl(baseUrl, itemId, tag, type, options) {
    if (tag === undefined) return ""
    var extraQuery = "";
    for (var prop in options) {
        if (options.hasOwnProperty(prop)) {
            var value = options[prop];
            if (prop === "maxWidth" || prop === "maxHeight") {
                value = Math.floor(options[prop]);
            }
            extraQuery += "&" + prop + "=" + value;
        }
    }
    return baseUrl + "/Items/" + itemId + "/Images/" + type + "?tag=" + tag + extraQuery
}

function usePortraitCover(itemType) {
    return ["Series", "Movie", "tvshows", "movies"].indexOf(itemType) >= 0
}

/**
 * Returns the page url for a certain item type.
 */
function getPageUrl(mediaType, itemType, isFolder) {
    switch (itemType.toLowerCase()) {
    case "series":
        return Qt.resolvedUrl("pages/itemdetails/SeriesPage.qml")
    case "movie":
        return Qt.resolvedUrl("pages/itemdetails/FilmPage.qml")
    case "collection":
    case "photoalbum":
        return Qt.resolvedUrl("pages/itemdetails/CollectionPage.qml")
    case "season":
        return Qt.resolvedUrl("pages/itemdetails/SeasonPage.qml")
    case "episode":
        return Qt.resolvedUrl("pages/itemdetails/EpisodePage.qml")
    case "musicalbum":
        return Qt.resolvedUrl("pages/itemdetails/MusicAlbumPage.qml")
    case "photo":
        return Qt.resolvedUrl("pages/itemdetails/PhotoPage.qml")
    default:
        switch (mediaType ? mediaType.toLowerCase() : isFolder ? "folder" : "") {
        case "folder":
            return Qt.resolvedUrl("pages/itemdetails/CollectionPage.qml")
        case "video":
            return Qt.resolvedUrl("pages/itemdetails/VideoPage.qml")
        case "photo":
            return Qt.resolvedUrl("pages/itemdetails/PhotoPage.qml")
        default:
            if (isFolder) return Qt.resolvedUrl("pages/itemdetails/CollectionPage.qml")
            return Qt.resolvedUrl("pages/itemdetails/UnsupportedPage.qml")
        }
    }
}

/**
 * Generates a "nice" color based on a string by "hashing" it.
 */
function colorFromString(string) {
    var hash = 0;
    for (var i = 0; i < string.length; i++) {
        hash += string.charCodeAt(i);
    }
    hash = (hash % 16) / 16;
    return Qt.hsva(hash, 1.0, 1.0, 1.0);
}
