boat-cli 0.9.2

Basic Opinionated Activity Tracker, a command line interface inspired by bartib
use anyhow::{Result, bail};
use boat_lib::repository::{Id, activities_repository as activities};
use chrono::Local;
use log::{info, warn};
use rusqlite::Connection;
use yansi::Paint;

use crate::{
    cli,
    commands::{self, pause_current},
    config::Configuration,
    utils,
};

pub fn start(
    config: &Configuration,
    conn: &mut Connection,
    args: &cli::StartActivityArgs,
) -> Result<()> {
    let activity_id = args.activity_handle.parse::<Id>();

    if config.commands.start.quick_start {
        info!("quick start enabled, allow to create a named activity and start it on the fly");

        if activity_id.is_err() {
            return commands::create::create(
                config,
                conn,
                &cli::CreateActivityArgs {
                    name: args.activity_handle.clone(),
                    description: None,
                    tags: vec![],
                    auto_start: true,
                    no_auto_start: false,
                    use_json_format: false,
                },
            );
        }
    }

    let activity_id = match activity_id {
        Ok(id) => id,
        Err(_) => {
            warn!(
                "cannot start because activity handle is not an integer '{}' and quick start is disabled",
                args.activity_handle
            );
            bail!(utils::display::invalid_activity_id_format(
                &args.activity_handle
            ));
        }
    };

    let Ok(to_start) = activities::get_by_id(conn, activity_id) else {
        info!("cannot start because ID is invalid: {}", activity_id);
        bail!(utils::display::activity_id_does_not_exist(activity_id));
    };

    if let Some(current) = activities::get_current_ongoing(conn)? {
        info!("ongoing activity: {current:?}");

        if current.id == activity_id {
            info!("not starting because same activity already ongoing");
            println!("{}", "activity already ongoing...".italic());
            return Ok(());
        }

        info!("pausing current...");
        pause_current(config, conn)?;
    }

    info!("about to start: {to_start:?}");
    activities::start(conn, activity_id)?;
    println!(
        "{}",
        utils::display::started_activity_msg(&to_start, Local::now())
    );

    Ok(())
}