use crate::domain::events::EventBus;
use crate::domain::repositories::challenge_repository::ChallengeRepository;
use crate::domain::repositories::git_repository_repository::GitRepositoryRepository;
use crate::domain::repositories::session_repository::SessionRepository;
use crate::domain::repositories::stage_repository::StageRepository as DomainStageRepository;
use crate::domain::repositories::trending_repository::TrendingRepository;
use crate::domain::repositories::version_repository::VersionRepository;
use crate::domain::services::analytics_service::AnalyticsService;
use crate::domain::services::config_service::ConfigService;
use crate::domain::services::repository_service::RepositoryService;
use crate::domain::services::scoring::{SessionTracker, TotalTracker};
use crate::domain::services::session_manager_service::SessionManager;
use crate::domain::services::session_service::SessionService;
use crate::domain::services::stage_builder_service::StageRepository as StageBuilderRepository;
use crate::domain::services::theme_service::ThemeService;
use crate::domain::services::version_service::VersionService;
use crate::domain::stores::{ChallengeStore, RepositoryStore, SessionStore};
use crate::infrastructure::database::daos::{ChallengeDao, RepositoryDao, SessionDao, StageDao};
use crate::infrastructure::database::database::Database;
use crate::infrastructure::http::github_api_client::GitHubApiClientFactoryImpl;
use crate::infrastructure::http::oss_insight_client::OssInsightClient;
use crate::infrastructure::storage::compressed_file_storage::CompressedFileStorage;
use crate::infrastructure::storage::file_storage::FileStorage;
use crate::infrastructure::terminal::TerminalComponent;
use crate::presentation::tui::screens::{
    AnalyticsScreen, AnimationScreen, HelpScreen, InfoDialogScreen, LoadingScreen, PanicScreen,
    RecordsScreen, RepoListScreen, RepoPlayScreen, SessionDetailScreen, SessionDetailsDialog,
    SessionFailureScreen, SessionSummaryScreen, SessionSummaryShareScreen, SettingsScreen,
    StageSummaryScreen, TitleScreen, TotalSummaryScreen, TotalSummaryShareScreen,
    TrendingLanguageSelectionScreen, TrendingRepositorySelectionScreen, TypingScreen,
    VersionCheckScreen,
};
use crate::presentation::tui::ScreenManagerFactoryImpl;

shaku::module! {
    pub AppModule {
        components = [
            FileStorage,
            CompressedFileStorage,
            OssInsightClient,
            GitHubApiClientFactoryImpl,
            Database,
            ChallengeDao,
            RepositoryDao,
            SessionDao,
            StageDao,
            EventBus,
            TerminalComponent,
            ChallengeStore,
            RepositoryStore,
            SessionStore,
            GitRepositoryRepository,
            SessionRepository,
            DomainStageRepository,
            ChallengeRepository,
            TrendingRepository,
            VersionRepository,
            SessionService,
            SessionManager,
            SessionTracker,
            TotalTracker,
            StageBuilderRepository,
            AnalyticsService,
            RepositoryService,
            VersionService,
            ConfigService,
            ThemeService,
            ScreenManagerFactoryImpl,
            TitleScreen,
            TypingScreen,
            AnimationScreen,
            HelpScreen,
            LoadingScreen,
            PanicScreen,
            SessionFailureScreen,
            InfoDialogScreen,
            SessionDetailsDialog,
            StageSummaryScreen,
            AnalyticsScreen,
            RecordsScreen,
            RepoListScreen,
            RepoPlayScreen,
            SessionDetailScreen,
            SessionSummaryScreen,
            SessionSummaryShareScreen,
            SettingsScreen,
            TotalSummaryScreen,
            TotalSummaryShareScreen,
            TrendingLanguageSelectionScreen,
            TrendingRepositorySelectionScreen,
            VersionCheckScreen
        ],
        providers = []
    }
}
