#![deny(clippy::undocumented_unsafe_blocks)]

pub mod deck_format;
pub mod deck_import;
pub mod model;
pub mod review_store;
pub mod scheduler;
pub mod sync;
pub mod sync_http;
pub mod sync_http_client;
pub mod sync_oauth;

pub use deck_format::{
    DeckField, DeckFile, DeckFormatError, DeckMetadata, DeckParseError, format_deck,
    format_deck_file, format_deck_with_metadata, parse_deck, parse_deck_file,
};
pub use deck_import::{
    AnkiDeckImportResult, AnkiDeckImportSummary, DeckImportError, import_anki_apkg,
    import_anki_apkg_reader, write_imported_anki_audio_files,
};
pub use model::{
    Datum, DatumKey, DatumValidationError, PromptGuess, RatingValueError, RecallFeedback,
    ReversalPolicy, Review,
};
pub use review_store::{
    ReviewEvent, ReviewPass, ReviewPassItem, ReviewPassSummary, ReviewStoreError, SqliteReviewStore,
};
pub use scheduler::{
    CURRENT_REVIEW_SCHEDULER_ALGORITHM, CardMemoryState, CardSchedule, ScheduledCard,
    ScheduledDatum, ScheduledSelectionKind, SchedulerAlgorithm, SchedulerConfig,
    estimated_recall_now, recent_scheduler_underperformance_signal, schedule_datum,
    schedule_datum_for_key, schedule_session, schedule_session_for_keys,
};
pub use sync::{
    DeckVisibility, InMemorySyncServer, LocalDeckSyncState, LocalDeckSyncStateError,
    LocalDeviceIdentity, SqliteSyncError, SqliteSyncServer, SyncAccountDeletionOutcome,
    SyncAuthError, SyncAuthSession, SyncBundlePayload, SyncDeckSummary, SyncDeleteError,
    SyncDownload, SyncDownloadError, SyncDownloadKind, SyncOAuthPendingLogin,
    SyncOAuthPendingLoginParts, SyncOAuthStart, SyncQuotaStatus, SyncRemoteDeckStatus,
    SyncServerLimits, SyncSharedDeckStatus, SyncUploadError, SyncUploadOutcome, SyncUploadRequest,
    SyncUuid, SyncUuidGenerationError, SyncUuidParseError, SyncValidationError,
    normalize_device_name, sync_bundle_hash,
};
pub use sync_http_client::{HttpSyncClient, HttpSyncClientError};
pub use sync_oauth::{
    FEDI_OAUTH_SCOPE, FediOAuthApplication, FediOAuthError, MastodonOAuthProvider,
    SyncOAuthProvider,
};
