Toggl Track client
use std::sync::{Arc, Mutex};

use diesel::{RunQueryDsl, SqliteConnection};
use toggl_api::{Timestamp, Toggl};

use crate::model::ServerTimeEntry;

pub(crate) struct Daemon {
    api: Toggl,
    last_sync: Option<Timestamp>,
    db: Arc<Mutex<SqliteConnection>>,
}

impl Daemon {
    pub(crate) fn new(api: Toggl, db: Arc<Mutex<SqliteConnection>>) -> Self {
        Self {
            api,
            last_sync: None,
            db,
        }
    }
    pub(crate) async fn sync(&mut self) -> Result<(), ()> {
        let (data, new_last_sync) = self.api.all_data(self.last_sync).await?;

        let mut db = self.db.lock().unwrap();

        let entries_cnt = data.time_entries.len();
        if entries_cnt > 0 {
            println!("Downloading {} time entries...", entries_cnt);
        }

        for time_entry in data.time_entries {
            let time_entry: ServerTimeEntry = time_entry.into();
            {
                use crate::schema::time_entries::dsl::*;
                diesel::insert_into(time_entries)
                    .values(&time_entry)
                    .on_conflict(server_id)
                    .do_update()
                    .set(&time_entry)
                    .execute(&mut *db)
                    .unwrap();
            }
        }
        self.last_sync = Some(new_last_sync);
        Ok(())
    }
}