use std::sync::Arc;
use std::sync::atomic::AtomicBool;
use datalogic_rs::Engine as DatalogicEngine;
use metrics_exporter_prometheus::PrometheusHandle;
use tokio::sync::{Mutex, RwLock};
use crate::channel::ChannelRegistry;
use crate::config::AppConfig;
use crate::connector::ConnectorRegistry;
use crate::connector::cache_backend::CachePool;
use crate::queue::TraceQueue;
use crate::server::rate_limit::RateLimitState;
use crate::storage::DbPool;
use crate::storage::repositories::audit_logs::AuditLogRepository;
use crate::storage::repositories::channels::ChannelRepository;
use crate::storage::repositories::connectors::ConnectorRepository;
use crate::storage::repositories::traces::TraceRepository;
use crate::storage::repositories::workflows::WorkflowRepository;
pub struct AppStateInner {
pub engine: Arc<RwLock<Arc<dataflow_rs::Engine>>>,
pub channel_repo: Arc<dyn ChannelRepository>,
pub workflow_repo: Arc<dyn WorkflowRepository>,
pub connector_repo: Arc<dyn ConnectorRepository>,
pub trace_repo: Arc<dyn TraceRepository>,
pub audit_log_repo: Arc<dyn AuditLogRepository>,
pub connector_registry: Arc<ConnectorRegistry>,
pub cache_pool: Arc<CachePool>,
pub channel_registry: Arc<ChannelRegistry>,
pub trace_queue: TraceQueue,
pub db_pool: DbPool,
pub config: Arc<AppConfig>,
pub start_time: chrono::DateTime<chrono::Utc>,
pub metrics_handle: PrometheusHandle,
pub http_client: reqwest::Client,
pub datalogic: Arc<DatalogicEngine>,
pub rate_limit_state: Option<Arc<RateLimitState>>,
pub ready: Arc<AtomicBool>,
pub sql_pool_cache: Arc<crate::connector::pool_cache::SqlPoolCache>,
pub mongo_pool_cache: Arc<crate::connector::mongo_pool::MongoPoolCache>,
pub kafka_consumer_handle: Arc<Mutex<Option<crate::kafka::consumer::ConsumerHandle>>>,
pub kafka_producer: Option<Arc<crate::kafka::producer::KafkaProducer>>,
pub trace_persistence_queue: crate::queue::TracePersistenceQueue,
}
pub type AppState = Arc<AppStateInner>;