type Unit = 'ms' | 's' | 'm' | 'h' | 'd';
interface Checkpoint {
    time: number;
    callback: () => void;
}
type Checkpoints = Checkpoint[];
interface TimeParts {
    ms: number;
    s: number;
    m: number;
    h: number;
    d: number;
}
type TimeModelStateValues = 'INITED' | 'PLAYING' | 'PAUSED' | 'STOPPED';
type Direction = 'forward' | 'backward';
type TimerValue = TimeParts & {
    state: TimeModelStateValues;
};

declare function getTimeParts(time: number, lastUnit: Unit, roundUnit?: Unit): TimeParts;

interface TimeModelOptions {
    initialTime: number;
    startImmediately: boolean;
    direction: "forward" | "backward";
    timeToUpdate: number;
    lastUnit: Unit;
    roundUnit: Unit;
    checkpoints: Checkpoints;
}
interface TimeModelEvents {
    onChange?: (timerValue: TimerValue) => void;
    onStart?: () => void;
    onResume?: () => void;
    onPause?: () => void;
    onStop?: () => void;
    onReset?: () => void;
}
declare class TimeModel {
    private options;
    events: TimeModelEvents;
    private internalTime;
    private time;
    private innerState;
    private timerId;
    constructor(options: TimeModelOptions, events?: TimeModelEvents);
    get value(): TimerValue;
    get currentOptions(): TimeModelOptions;
    /**
     * Change options methods
     **/
    changeTime: (time: number) => void;
    changeLastUnit: (lastUnit: Unit) => void;
    changeRoundUnit: (roundUnit: Unit) => void;
    changeTimeToUpdate: (interval: number) => void;
    changeDirection: (direction: Direction) => void;
    changeCheckpoints: (checkpoints: Checkpoints) => void;
    /**
     * Timer controls methods
     **/
    start: () => void;
    resume: (callImmediately?: boolean) => void;
    pause: () => void;
    stop: () => void;
    reset: () => void;
    /**
     * Private methods
     **/
    private setTimerInterval;
    private getTimerValue;
    private computeTime;
}

declare const useTimeModel: (timer: TimeModel) => {
    value: TimerValue;
    changeTime: (time: number) => void;
    changeLastUnit: (lastUnit: Unit) => void;
    changeTimeToUpdate: (interval: number) => void;
    changeDirection: (direction: Direction) => void;
    changeCheckpoints: (checkpoints: Checkpoints) => void;
    start: () => void;
    pause: () => void;
    resume: (callImmediately?: boolean) => void;
    stop: () => void;
    reset: () => void;
};

declare const createTimeModel: (options?: Partial<TimeModelOptions>, events?: TimeModelEvents) => TimeModel;

export { Checkpoint, Checkpoints, Direction, TimeModelStateValues, TimeParts, TimerValue, Unit, createTimeModel, getTimeParts, useTimeModel };
