use futures::executor::block_on;
use serde_derive::{Deserialize, Serialize};
use sqlx::pool::PoolConnection;
use sqlx::Sqlite;

use crate::db::DbMacro;
use crate::errors::DatabaseError;
use crate::models::{convert_db_list, FromDbModel, MacroAction};

#[derive(Serialize, Deserialize, Debug, Clone)]
pub struct Macro {
	#[serde(flatten)]
	pub m: DbMacro,
	pub actions: Vec<MacroAction>,
}


impl FromDbModel for Macro {
	type DbModel = DbMacro;
	type DbModelCache = ();

	fn from_db_model(
		conn: &mut PoolConnection<Sqlite>,
		db_model: Self::DbModel,
	) -> Result<Self, DatabaseError> {
		Self::from_db_model_cache(conn, db_model, ())
	}

	fn from_db_model_cache(
		conn: &mut PoolConnection<Sqlite>,
		db_model: Self::DbModel,
		_cache: Self::DbModelCache,
	) -> Result<Self, DatabaseError> {
		let actions_db = block_on(db_model.get_actions(conn))?;
		let actions: Vec<MacroAction> = convert_db_list(conn, actions_db)?;

		Ok(Macro {
			m: db_model,
			actions,
		})
	}
}