package app.closer.di

import app.closer.core.billing.EntitlementChecker
import app.closer.core.billing.FirestoreEntitlementChecker
import app.closer.data.local.SettingsDataStore
import app.closer.data.repository.BucketListRepositoryImpl
import app.closer.data.repository.CoupleRepositoryImpl
import app.closer.data.repository.DateMatchRepositoryImpl
import app.closer.data.repository.DatePlanRepositoryImpl
import app.closer.data.repository.OutcomeRepositoryImpl
import app.closer.data.repository.QuestionSessionRepositoryImpl
import app.closer.data.repository.FirebaseAuthRepositoryImpl
import app.closer.data.repository.InviteRepositoryImpl
import app.closer.data.repository.SharedPreferencesLocalAnswerRepository
import app.closer.data.repository.RoomQuestionRepository
import app.closer.data.repository.QuestionThreadRepositoryImpl
import app.closer.data.repository.ConversationRepositoryImpl
import app.closer.data.repository.RevenueCatBillingRepository
import app.closer.data.repository.UserRepositoryImpl
import app.closer.domain.repository.AuthRepository
import app.closer.domain.repository.BillingRepository
import app.closer.domain.repository.BucketListRepository
import app.closer.domain.repository.CoupleRepository
import app.closer.domain.repository.DateMatchRepository
import app.closer.domain.repository.DatePlanRepository
import app.closer.domain.repository.QuestionSessionRepository
import app.closer.domain.repository.OutcomeRepository
import app.closer.domain.repository.InviteRepository
import app.closer.domain.repository.LocalAnswerRepository
import app.closer.domain.repository.QuestionRepository
import app.closer.domain.repository.QuestionThreadRepository
import app.closer.domain.repository.ConversationRepository
import app.closer.domain.repository.SettingsRepository
import app.closer.domain.repository.UserRepository
import dagger.Binds
import dagger.Module
import dagger.hilt.InstallIn
import dagger.hilt.components.SingletonComponent
import javax.inject.Singleton

@Module
@InstallIn(SingletonComponent::class)
abstract class RepositoryModule {

    @Binds @Singleton
    abstract fun bindAuthRepository(impl: FirebaseAuthRepositoryImpl): AuthRepository

    @Binds @Singleton
    abstract fun bindUserRepository(impl: UserRepositoryImpl): UserRepository

    @Binds @Singleton
    abstract fun bindInviteRepository(impl: InviteRepositoryImpl): InviteRepository

    @Binds @Singleton
    abstract fun bindCoupleRepository(impl: CoupleRepositoryImpl): CoupleRepository

    @Binds @Singleton
    abstract fun bindDateMatchRepository(impl: DateMatchRepositoryImpl): DateMatchRepository

    @Binds @Singleton
    abstract fun bindDatePlanRepository(impl: DatePlanRepositoryImpl): DatePlanRepository

    @Binds @Singleton
    abstract fun bindBucketListRepository(impl: BucketListRepositoryImpl): BucketListRepository

    @Binds @Singleton
    abstract fun bindQuestionThreadRepository(impl: QuestionThreadRepositoryImpl): QuestionThreadRepository

    @Binds @Singleton
    abstract fun bindConversationRepository(impl: ConversationRepositoryImpl): ConversationRepository

    @Binds @Singleton
    abstract fun bindQuestionRepository(impl: RoomQuestionRepository): QuestionRepository

    @Binds @Singleton
    abstract fun bindLocalAnswerRepository(impl: SharedPreferencesLocalAnswerRepository): LocalAnswerRepository

    @Binds @Singleton
    abstract fun bindEntitlementChecker(impl: FirestoreEntitlementChecker): EntitlementChecker

    @Binds @Singleton
    abstract fun bindSettingsRepository(impl: SettingsDataStore): SettingsRepository

    @Binds @Singleton
    abstract fun bindBillingRepository(impl: RevenueCatBillingRepository): BillingRepository

    @Binds @Singleton
    abstract fun bindQuestionSessionRepository(impl: QuestionSessionRepositoryImpl): QuestionSessionRepository

    @Binds @Singleton
    abstract fun bindOutcomeRepository(impl: OutcomeRepositoryImpl): OutcomeRepository
}
