import { DurationSeconds, isString, UnixTimestampSeconds } from "../types";
import moment, { Moment } from "moment";

export function now(): UnixTimestampSeconds {
    return Math.round(Date.now() / 1000.0) as UnixTimestampSeconds;
}

export function subtract(
    timestamp: UnixTimestampSeconds,
    duration: DurationSeconds
): UnixTimestampSeconds {
    return (timestamp - duration) as UnixTimestampSeconds;
}

const SECOND: DurationSeconds = 1 as DurationSeconds;
const MINUTE: DurationSeconds = (60 * SECOND) as DurationSeconds;
const HOUR: DurationSeconds = (60 * MINUTE) as DurationSeconds;
const DAY: DurationSeconds = (24 * HOUR) as DurationSeconds;
const WEEK: DurationSeconds = (7 * DAY) as DurationSeconds;

export function seconds(n: number): DurationSeconds {
    return (n * SECOND) as DurationSeconds;
}

export function minutes(n: number): DurationSeconds {
    return (n * MINUTE) as DurationSeconds;
}

export function hours(n: number): DurationSeconds {
    return (n * HOUR) as DurationSeconds;
}

export function days(n: number): DurationSeconds {
    return (n * DAY) as DurationSeconds;
}

export function weeks(n: number): DurationSeconds {
    return (n * WEEK) as DurationSeconds;
}

export function unix(moment: Moment): UnixTimestampSeconds {
    return moment.unix() as UnixTimestampSeconds;
}

export function formatTimestamp(timestamp: UnixTimestampSeconds): string {
    return moment.unix(timestamp).format();
}

export function parseTimestamp(
    timestamp: unknown
): UnixTimestampSeconds | null {
    if (!isString(timestamp)) {
        return null;
    }
    const parsed = moment.utc(timestamp);
    if (!parsed.isValid()) {
        return null;
    }
    return unix(parsed);
}