#include "common/duration.h"

void ffDurationAppendNum(uint64_t totalSeconds, FFstrbuf* result) {
    const FFOptionsDisplay* options = &instance.config.display;

    bool spaceBeforeUnit = options->durationSpaceBeforeUnit != FF_SPACE_BEFORE_UNIT_NEVER;

    if (totalSeconds < 60) {
        ffStrbufAppendUInt(result, totalSeconds);
        if (spaceBeforeUnit) {
            ffStrbufAppendC(result, ' ');
        }
        ffStrbufAppendS(result, options->durationAbbreviation ? "sec" : "second");
        if (totalSeconds != 1) {
            ffStrbufAppendC(result, 's');
        }
        return;
    }

    uint32_t seconds = (uint32_t) (totalSeconds % 60);
    totalSeconds /= 60;
    if (seconds >= 30) {
        totalSeconds++;
    }

    uint32_t minutes = (uint32_t) (totalSeconds % 60);
    totalSeconds /= 60;
    uint32_t hours = (uint32_t) (totalSeconds % 24);
    totalSeconds /= 24;
    uint32_t days = (uint32_t) totalSeconds;

    if (days > 0) {
        ffStrbufAppendUInt(result, days);
        if (spaceBeforeUnit) {
            ffStrbufAppendC(result, ' ');
        }
        if (options->durationAbbreviation) {
            ffStrbufAppendC(result, 'd');

            if (hours > 0 || minutes > 0) {
                ffStrbufAppendC(result, ' ');
            }
        } else {
            ffStrbufAppendS(result, days == 1 ? "day" : "days");

            if (days >= 100) {
                ffStrbufAppendS(result, "(!)");
            }

            if (hours > 0 || minutes > 0) {
                ffStrbufAppendS(result, ", ");
            }
        }
    }

    if (hours > 0) {
        ffStrbufAppendUInt(result, hours);
        if (spaceBeforeUnit) {
            ffStrbufAppendC(result, ' ');
        }
        if (options->durationAbbreviation) {
            ffStrbufAppendC(result, 'h');

            if (minutes > 0) {
                ffStrbufAppendC(result, ' ');
            }
        } else {
            ffStrbufAppendS(result, hours == 1 ? "hour" : "hours");

            if (minutes > 0) {
                ffStrbufAppendS(result, ", ");
            }
        }
    }

    if (minutes > 0) {
        ffStrbufAppendUInt(result, minutes);
        if (spaceBeforeUnit) {
            ffStrbufAppendC(result, ' ');
        }
        if (options->durationAbbreviation) {
            ffStrbufAppendC(result, 'm');
        } else {
            ffStrbufAppendS(result, minutes == 1 ? "min" : "mins");
        }
    }
}
