/**
 * FormatUtils — Shared date/time formatting utilities.
 *
 * Used by: ScansPage, ReportsPage, RecentScans, ScanDetails,
 *          SeverityChart, ReportSummary, HomePage.
 */
var FormatUtils = {
    MONTHS: ['Jan','Feb','Mar','Apr','May','Jun','Jul','Aug','Sep','Oct','Nov','Dec'],

    /** "Just now", "5m ago", "3h ago", "2d ago" */
    timeAgo: function (ts) {
        var diff = Date.now() - ts;
        var mins = Math.floor(diff / 60000);
        if (mins < 1) return 'Just now';
        if (mins < 60) return mins + 'm ago';
        if (mins < 1440) return Math.floor(mins / 60) + 'h ago';
        return Math.floor(mins / 1440) + 'd ago';
    },

    /** "Jan 27" */
    shortDate: function (ts) {
        var d = new Date(ts);
        return FormatUtils.MONTHS[d.getMonth()] + ' ' + d.getDate();
    },

    /** "Jan 27, 2025" */
    fullDate: function (ts) {
        var d = new Date(ts);
        return FormatUtils.MONTHS[d.getMonth()] + ' ' + d.getDate() + ', ' + d.getFullYear();
    },

    /** "Jan 27, 2025, 2:30 PM" */
    dateTime: function (ts) {
        var d = new Date(ts);
        var hours = d.getHours();
        var mins = d.getMinutes();
        var ampm = hours >= 12 ? 'PM' : 'AM';
        hours = hours % 12 || 12;
        var minStr = mins < 10 ? '0' + mins : '' + mins;
        return FormatUtils.MONTHS[d.getMonth()] + ' ' + d.getDate() + ', ' + d.getFullYear() + ', ' + hours + ':' + minStr + ' ' + ampm;
    },

    /** Groups a timestamp into "Today", "Yesterday", "This Week", "Older" */
    dateGroup: function (ts) {
        var now = new Date();
        var d = new Date(ts);
        var today = new Date(now.getFullYear(), now.getMonth(), now.getDate());
        var yesterday = new Date(today.getTime() - 86400000);
        var weekAgo = new Date(today.getTime() - 6 * 86400000);
        if (d >= today) return 'Today';
        if (d >= yesterday) return 'Yesterday';
        if (d >= weekAgo) return 'This Week';
        return 'Older';
    },

    /** Shallow-clones `obj` with `field` set to `value`. Returns the new object. */
    patchObject: function (obj, field, value) {
        var updated = {};
        for (var k in obj) { updated[k] = obj[k]; }
        updated[field] = value;
        return updated;
    },
};

window.FormatUtils = FormatUtils;
