move_timer 0.1.0

a small, portable desktop app reminding you to move a bit during ctivities like programming
use std::time::Duration;

use crate::utils::{duration_from_secs_mins_hours, hours_mins_secs};

pub(crate) const DEFAULT_DURATION: Duration = Duration::from_mins(15);

#[derive(Debug)]
pub(crate) struct AppData {
    pub(crate) progress: Duration,
    pub(crate) total: Duration,
    pub(crate) paused: bool,
    pub(crate) notif_sent: bool,
    pub(crate) hour_input: String,
    pub(crate) hour_parsed: u64,
    pub(crate) min_input: String,
    pub(crate) min_parsed: u64,
    pub(crate) sec_input: String,
    pub(crate) sec_parsed: u64,
}

impl AppData {
    pub(crate) fn new(duration: Duration) -> AppData {
        let (default_hour, default_min, default_sec) = hours_mins_secs(duration);

        AppData {
            progress: Duration::ZERO,
            total: duration,
            paused: true,
            notif_sent: false,
            hour_input: format!("{}h", default_hour),
            hour_parsed: default_hour,
            min_input: format!("{}m", default_min),
            min_parsed: default_min as u64,
            sec_input: format!("{}s", default_sec),
            sec_parsed: default_sec as u64,
        }
    }

    pub(crate) fn advance_timer_by(&mut self, duration: Duration) {
        let new_progress = self.progress + duration;

        self.progress = if new_progress >= self.total {
            self.total
        } else {
            new_progress
        };
    }

    pub(crate) fn set_new_duration(&mut self, new_duration: Duration) {
        self.total = new_duration;

        if self.progress > new_duration {
            self.progress = new_duration;
        }
    }

    pub(crate) fn input_duration(&self) -> Duration {
        duration_from_secs_mins_hours(self.sec_parsed, self.min_parsed, self.hour_parsed)
    }
}