const sdl = @import("./../sdl.zig").c;
const std = @import("std");

pub const TimerStatus = enum { started, stopped, paused };

pub const Timer = struct {
    start_ticks_ns: f64 = 0.0,
    pause_ticks_ns: f64 = 0.0,
    status: TimerStatus = TimerStatus.stopped,

    pub fn start(self: *Timer) void {
        if (self.status == .started) return;
        self.status = .started;
        self.start_ticks_ns = @floatFromInt(std.time.nanoTimestamp());
        self.pause_ticks_ns = 0;
    }

    pub fn stop(self: *Timer) void {
        if (self.status == .stopped) return;
        self.status = .stopped;
        self.start_ticks_ns = 0;
        self.pause_ticks_ns = 0;
    }

    // Resets the timer to 0 and starts it
    pub fn reset(self: *Timer) void {
        self.status = .started;
        self.start_ticks_ns = @floatFromInt(std.time.nanoTimestamp());
        self.pause_ticks_ns = 0;
    }

    pub fn pause(self: *Timer) void {
        if (self.status == .paused or self.status == .stopped) return;
        self.status = .paused;
        const ns_stampf: f64 = @floatFromInt(std.time.nanoTimestamp());
        self.pause_ticks_ns = (ns_stampf - self.start_ticks_ns) / 1_000_000;
    }

    pub fn unpause(self: *Timer) void {
        if (self.status == .started or self.status == .stopped) return;
        self.status = .started;
        const ns_stampf: f64 = @floatFromInt(std.time.nanoTimestamp());
        const diff_ns: f64 = ns_stampf - self.pause_ticks_ns;
        self.start_ticks_ns = self.start_ticks_ns + diff_ns;
        self.pause_ticks_ns = 0;
    }

    // Gets the current tick/ms of the timer
    pub fn getTicks(self: *Timer) f64 {
        switch (self.status) {
            .stopped => {
                return 0;
            },
            .paused => {
                return self.pause_ticks_ns / 1_000_000;
            },
            .started => {
                const ns_stampf: f64 = @floatFromInt(std.time.nanoTimestamp());
                return (ns_stampf - self.start_ticks_ns) / 1_000_000;
            },
        }
    }
};