import clone from '../lang/clone';

/**
 * get a new Date object representing start of period
 */
function startOf(date, period) {
    date = clone(date);

    // intentionally removed "break" from switch since start of
    // month/year/etc should also reset the following periods
    switch (period) {
        case 'year':
            date.setMonth(0);
        /* falls through */
        case 'month':
            date.setDate(1);
        /* falls through */
        case 'week':
        case 'day':
            date.setHours(0);
        /* falls through */
        case 'hour':
            date.setMinutes(0);
        /* falls through */
        case 'minute':
            date.setSeconds(0);
        /* falls through */
        case 'second':
            date.setMilliseconds(0);
            break;
        default:
            throw new Error(`"${period}" is not a valid period`);
    }

    // week is the only case that should reset the weekDay and maybe even
    // overflow to previous month
    if (period === 'week') {
        const weekDay = date.getDay();
        const baseDate = date.getDate();
        if (weekDay) {
            if (weekDay >= baseDate) {
                // start of the week is on previous month
                date.setDate(0);
            }
            date.setDate(date.getDate() - date.getDay());
        }
    }

    return date;
}

export default startOf;
