//! External services integration
//!
//! This module contains integrations with external services like
//! Google Calendar, Gmail, Wave Accounting, and S3/Garage storage.
//! Also includes internal services for events, notifications, and metadata.

pub mod email_templates;
pub mod events;
pub mod gmail;
pub mod job_queue;
pub mod google_auth;
pub mod google_calendar;
pub mod image;
pub mod metadata;
pub mod notification_delivery;
pub mod notifications;
pub mod s3;
pub mod video;
pub mod wave;

// Re-export commonly used types
pub use email_templates::{EmailTemplate, EmailTemplateRegistry, TemplateError};
pub use gmail::{
    Email, EmailListResponse, EmailMessage, GmailError, GmailService, ListEmailsQuery,
    SendEmailRequest, SendEmailResponse,
};
pub use google_auth::{GoogleAuthError, GoogleAuthService, GMAIL_FULL_SCOPE, GMAIL_SEND_SCOPE, GOOGLE_CALENDAR_SCOPE};
pub use google_calendar::{
    Attendee, CalendarError, CalendarEvent, CreateEventRequest, EventDateTime, EventReminder,
    EventReminders, GoogleCalendarService, ListEventsQuery, UpdateEventRequest,
};
pub use image::{
    generate_thumbnail, process_image, ImageError, ProcessedImage, MAX_IMAGE_SIZE, THUMBNAIL_SIZE,
};
pub use s3::{S3Error, S3Service};
pub use video::{extract_metadata, generate_thumbnail as generate_video_thumbnail, verify_video, VideoError, VideoMetadata, MAX_VIDEO_SIZE};
pub use wave::{
    CreateAddressInput as WaveCreateAddressInput,
    CreateCustomerInput as WaveCreateCustomerInput,
    CreateInvoiceInput as WaveCreateInvoiceInput,
    CreateInvoiceItemInput as WaveCreateInvoiceItemInput,
    CreateProductInput as WaveCreateProductInput,
    UpdateCustomerInput as WaveUpdateCustomerInput,
    UpdateProductInput as WaveUpdateProductInput,
    WaveCustomer, WaveError, WaveInvoice, WaveInvoiceConnection, WaveInvoiceListItem,
    WavePageInfo, WaveProduct, WaveService,
};

// Event and notification services
pub use events::EventPublisher;
pub use job_queue::JobQueue;
pub use metadata::MetadataEnricher;
pub use notification_delivery::{NotificationDeliveryService, MAX_DELIVERY_ATTEMPTS};
pub use notifications::NotificationProcessor;
