import {get_strings} from 'core/str';

/**
 * Load the translation of strings from a strings object
 * @param {Object} strings The map of strings
 * @returns {Object} The map with strings loaded in
 */
export function load_strings(strings){
    for(let idx in strings){
        let stringkeys = [];
        for(const handle in  strings[idx]){
            const key = strings[idx][handle];
            let parts = key.split("$");
            let identifier = parts[0];
            let component = (parts.length > 1)?parts[1]:'local_treestudyplan';
            stringkeys.push({ key: identifier, component: component});
        }
        get_strings(stringkeys).then(function(str){
            let i = 0;
            for(const key in strings[idx]){
                strings[idx][key] = str[i];
                i++;
            }
        });
    }

    return strings;
}

/**
 * Load the translation of strings from a strings object based on keys
 * Used for loading values for a drop down menu or the like
 * @param {Object} string_keys The map of stringkeys
 * @returns {Object} The map with strings loaded in
 */
export function load_stringkeys(string_keys){
    for(let idx in string_keys){
        // Get text strings for condition settings
        let stringkeys = [];
        for(const i in  string_keys[idx]){
            const key = string_keys[idx][i].textkey;
            let parts = key.split("$");
            let identifier = parts[0];
            let component = (parts.length > 1)?parts[1]:'local_treestudyplan';
            stringkeys.push({ key: identifier, component: component});
        }
        get_strings(stringkeys).then(function(strings){
            for(const i in strings) {
                const s = strings[i];
                const l = string_keys[idx][i];
                l.text = s;
            }
        });
    }
    return string_keys;
}
/**
 * Format a date according to localized custom
 * @param {Date|string} d The date to convert
 * @param {boolean} short Short format (default false)
 * @returns {string}
 */
export function format_date(d,short){
    if(!(d instanceof Date)){
        d = new Date(d);
    }

    let monthformat = "short";
    if(short){
        monthformat = "numeric";
    }
    return d.toLocaleDateString(document.documentElement.lang,{
        year: 'numeric', month: monthformat, day: 'numeric'
    });
}

/**
 * Provides standardized information about the period between two dates
 * As
 * @param {Date|string} first First day of the span
 * @param {Date|string} last Last day of the span
 * @returns {Object} Object containing formatted start and end dates and span information
 */
export function datespaninfo(first,last){
    if(!(first instanceof Date)){ first = new Date(first);}
    if(!(last instanceof Date)){ last = new Date(last);}

    // Make sure the end date is at the very end of the day and the start date at the very beginning
    first.setHours(0);
    first.setMinutes(0);
    first.setSeconds(0);
    first.setMilliseconds(0);
    last.setHours(23);
    last.setMinutes(59);
    last.setSeconds(59);
    last.setMilliseconds(999);

    const dayspan = Math.round(((last - first)+1)/(24*60*60*1000)); // Add one millisecond to offset the 999 ms
    const years = Math.floor(dayspan/365); // Yes, we ignore leap years/leap days
    const ydaysleft = dayspan % 365;

    const weeks = Math.floor(ydaysleft/7);
    const wdaysleft = ydaysleft % 7;

    return {
        first: first,
        last: last,
        totaldays: dayspan,
        years: years,
        weeks: weeks,
        days: wdaysleft,
        formatted: {
            first: format_date(first),
            last: format_date(last),
        }
    };

}

