Toggl Track client
#[macro_use]
extern crate diesel;

use std::sync::{Arc, Mutex};

use diesel::{Connection, RunQueryDsl};
use toggl_api::Toggl;

use crate::model::TimeEntry;

mod config;
mod daemon;
mod model;
mod schema;

#[tokio::main]
async fn main() {
    let config = config::Config::parse();
    let toggl = Toggl::new(config.credentials.clone()).unwrap();

    let database_url = std::env::var("DATABASE_URL").expect("DATABASE_URL must be set");
    let db = Arc::new(Mutex::new(
        diesel::SqliteConnection::establish(&database_url).unwrap(),
    ));

    let mut daemon = crate::daemon::Daemon::new(toggl, db.clone());

    loop {
        let _ = daemon.sync().await;
        tokio::time::sleep(chrono::Duration::seconds(5).to_std().unwrap()).await;

        let all_entries = {
            use crate::schema::time_entries::dsl::*;

            time_entries
                .load::<TimeEntry>(&mut *db.lock().unwrap())
                .unwrap()
        };

        println!("----------------");
        for entry in &all_entries {
            println!(
                "{} ({} - {})",
                entry.description,
                entry.start,
                entry
                    .stop
                    .map_or_else(|| "...".to_string(), |t| t.to_string())
            );
        }
    }
}