import Foundation
import SwiftUI

@MainActor
final class AppRouter: ObservableObject {
    enum Tab: Hashable {
        case library
        case discover
        case stats
        case profile
    }

    enum Route: Hashable {
        case category(name: String)
        case detail(BookRemote)
    }

    @Published var isAuthenticated = false
    @Published var selectedTab: Tab = .library
    @Published var path: [Route] = []

    func resetToHome() {
        path.removeAll()
        selectedTab = .library
    }
}

struct AppDependencies {
    let apiClient: APIClientProtocol
    let authService: AuthServiceProtocol
    let booksService: BooksServiceProtocol
    let keychain: KeychainStoreProtocol
    let imageCache: ImageCacheProtocol

    static func live() -> AppDependencies {
        let config = URLSessionConfiguration.default
        config.waitsForConnectivity = false
        config.timeoutIntervalForRequest = 8
        config.timeoutIntervalForResource = 15
        let session = URLSession(configuration: config)
        let client = APIClient(baseURL: Bundle.main.apiBaseURL, session: session)
        return AppDependencies(
            apiClient: client,
            authService: AuthService(client: client),
            booksService: BooksService(client: client),
            keychain: KeychainStore(),
            imageCache: ImageCache.shared
        )
    }
}

private struct DependenciesKey: EnvironmentKey {
    static let defaultValue = AppDependencies.live()
}

extension EnvironmentValues {
    var dependencies: AppDependencies {
        get { self[DependenciesKey.self] }
        set { self[DependenciesKey.self] = newValue }
    }
}
