use crate::auth::session::CurrentUser;
use crate::config::app::RuniqueConfig;
use crate::context::template::AppError;
use crate::engine::RuniqueEngine;
use crate::prelude::{HostPolicy, SecurityPolicy};
use crate::utils::{csp_nonce::CspNonce, csrf::CsrfToken};
use sea_orm::DatabaseConnection;
use std::{collections::HashMap, result::Result, sync::Arc, sync::RwLock};
use tera::{Result as TeraResult, Tera, Value};
use tower_sessions::{SessionManagerLayer, SessionStore};
use crate::flash::FlashMessage;
use crate::forms::base::FormField;
use indexmap::IndexMap;
pub type ATera = Arc<Tera>;
pub type OATera = Option<ATera>;
pub type ADb = Arc<DatabaseConnection>;
pub type Bdd = Option<DatabaseConnection>;
pub type OADb = Option<ADb>;
pub type ASecurityCsp = Arc<SecurityPolicy>;
pub type OSecurityCsp = Option<ASecurityCsp>;
pub type ASecurityHosts = Arc<HostPolicy>;
pub type OSecurityHosts = Option<ASecurityHosts>;
pub type AEngine = Arc<RuniqueEngine>;
pub type OAEngine = Option<AEngine>;
pub type ARuniqueConfig = Arc<RuniqueConfig>;
pub type OARuniqueConfig = Option<ARuniqueConfig>;
pub type ASessionStore = Arc<dyn SessionStore + Send + Sync>;
pub type OCurrentUser = Option<CurrentUser>;
pub type OCsrfToken = Option<CsrfToken>;
pub type OCspNonce = Option<CspNonce>;
pub type StrMap = HashMap<String, String>;
pub type StrVecMap = HashMap<String, Vec<String>>;
pub type JsonMap = HashMap<String, Value>;
pub type FieldsMap = IndexMap<String, Box<dyn FormField>>;
pub type Messages = Vec<FlashMessage>;
pub type ARlockmap = Arc<RwLock<HashMap<String, String>>>;
pub type PendingUrls = Vec<(String, String)>;
pub type Session<S> = SessionManagerLayer<S>;
pub type AppResult<T> = Result<T, Box<AppError>>;
pub type TResult = TeraResult<Value>;
#[cfg(feature = "orm")]
pub type DbResult<T> = Result<T, sea_orm::DbErr>;