package it.integry.integrywmsnative.core.data_store.db;

import android.app.Application;

import androidx.room.Room;

import javax.inject.Singleton;

import dagger.Module;
import dagger.Provides;
import it.integry.integrywmsnative.core.data_store.db.dao.ArticoloGrigliaDao;
import it.integry.integrywmsnative.core.data_store.db.dao.ArticoloOrdineDao;
import it.integry.integrywmsnative.core.data_store.db.dao.GrigliaDao;
import it.integry.integrywmsnative.core.data_store.db.dao.OrdineDao;
import it.integry.integrywmsnative.core.data_store.db.repository.ArticoliOrdineRepository;
import it.integry.integrywmsnative.core.data_store.db.repository.ArticoloGrigliaRepository;
import it.integry.integrywmsnative.core.data_store.db.repository.GrigliaRepository;
import it.integry.integrywmsnative.core.data_store.db.repository.OrdineRepository;
import it.integry.integrywmsnative.core.data_store.db.repository.implementations.ArticoliGrigliaDataSource;
import it.integry.integrywmsnative.core.data_store.db.repository.implementations.ArticoliOrdineDataSource;
import it.integry.integrywmsnative.core.data_store.db.repository.implementations.GrigliaDataSource;
import it.integry.integrywmsnative.core.data_store.db.repository.implementations.OrdineDataSource;

@Module
public class RoomModule {

    private AppDatabase appDatabase;

    public RoomModule(Application application) {
        appDatabase = Room.databaseBuilder(application,
                AppDatabase.class, "integry_wms")
                .fallbackToDestructiveMigration()
                .build();
    }

    @Singleton
    @Provides
    AppDatabase providesRoomDatabase() {
        return appDatabase;
    }




    @Singleton
    @Provides
    ArticoloGrigliaDao providesArticoloGrigliaDao(AppDatabase appDatabase) {
        return appDatabase.articoloGrigliaDao();
    }

    @Singleton
    @Provides
    GrigliaDao providesGrigliaDao(AppDatabase appDatabase) {
        return appDatabase.grigliaDao();
    }

    @Singleton
    @Provides
    OrdineDao providesOrdineDao(AppDatabase appDatabase) {
        return appDatabase.ordineDao();
    }

    @Singleton
    @Provides
    ArticoloOrdineDao providesArticoloOrdineDao(AppDatabase appDatabase) {
        return appDatabase.articoloOrdineDao();
    }







    @Singleton
    @Provides
    ArticoloGrigliaRepository providesArticoloGrigliaRepository(ArticoloGrigliaDao articoloGrigliaDao) {
        return new ArticoliGrigliaDataSource(articoloGrigliaDao);
    }

    @Singleton
    @Provides
    ArticoliOrdineRepository providesArticoliOrdineRepository(ArticoloOrdineDao articoloOrdineDao) {
        return new ArticoliOrdineDataSource(articoloOrdineDao);
    }

    @Singleton
    @Provides
    GrigliaRepository providesGrigliaRepository(GrigliaDao grigliaDao) {
        return new GrigliaDataSource(grigliaDao);
    }

    @Singleton
    @Provides
    OrdineRepository providesOrdineRepository(OrdineDao ordineDao) {
        return new OrdineDataSource(ordineDao);
    }

}
