pub mod error;

use sea_orm::{Database, DatabaseConnection};

use crate::error::Error;

static DB_CONN: once_cell::sync::OnceCell<DatabaseConnection> = once_cell::sync::OnceCell::new();

pub async fn init_database(connection_uri: impl Into<String>) -> Result<(), Error> {
    let conn = Database::connect(connection_uri.into()).await?;
    DB_CONN.get_or_init(move || conn);
    Ok(())
}

pub fn get_database() -> Result<&'static DatabaseConnection, Error> {
    DB_CONN.get().ok_or(Error::Uninitialized)
}

#[cfg(test)]
mod tests {
    use super::get_database;
    use crate::{error::Error, init_database};

    #[test]
    fn unit_lib_error_uninitialized() {
        assert_eq!(get_database().unwrap_err(), Error::Uninitialized);
    }

    #[tokio::test]
    async fn unit_lib_connect_in_memory_sqlite() -> Result<(), Error> {
        init_database("sqlite::memory:").await?;
        get_database()?;
        Ok(())
    }
}