package de.accso.flexinale.backoffice.infrastructure;

import de.accso.flexinale.backoffice.application.services.FilmService;
import de.accso.flexinale.backoffice.application.services.KinoService;
import de.accso.flexinale.backoffice.application.services.VorfuehrungService;
import de.accso.flexinale.backoffice.application.services.FilmUploadService;
import de.accso.flexinale.backoffice.application.services.KinoUploadService;
import de.accso.flexinale.backoffice.application.services.KinoSaalUploadService;
import de.accso.flexinale.backoffice.application.services.VorfuehrungUploadService;
import de.accso.flexinale.backoffice.application.services.FilmRetrieverService;
import de.accso.flexinale.backoffice.application.services.KinoRetrieverService;
import de.accso.flexinale.backoffice.application.services.VorfuehrungRetrieverService;
import de.accso.flexinale.backoffice.domain.dao.FilmDao;
import de.accso.flexinale.backoffice.domain.dao.KinoDao;
import de.accso.flexinale.backoffice.domain.dao.KinoSaalDao;
import de.accso.flexinale.backoffice.domain.dao.VorfuehrungDao;
import de.accso.flexinale.backoffice.infrastructure.persistence.*;
import de.accso.flexinale.backoffice_api_contract.api_contract.FilmRetriever;
import de.accso.flexinale.backoffice_api_contract.api_contract.KinoRetriever;
import de.accso.flexinale.backoffice_api_contract.api_contract.VorfuehrungRetriever;
import org.springframework.boot.autoconfigure.domain.EntityScan;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.jpa.repository.config.EnableJpaRepositories;
import org.springframework.transaction.annotation.EnableTransactionManagement;

@Configuration
@EnableJpaRepositories({"de.accso.flexinale.backoffice.infrastructure.persistence"})
@EnableTransactionManagement
@EntityScan(basePackages={"de.accso.flexinale.backoffice.infrastructure.persistence"})
public class FlexinaleBackofficeSpringFactory {
    @Bean
    public de.accso.flexinale.backoffice.domain.services.FilmService createBackofficeFilmService(final FilmDao filmDao) {
        return new de.accso.flexinale.backoffice.domain.services.FilmService(filmDao);
    }

    @Bean
    public FilmService createApplicationFilmService(final de.accso.flexinale.backoffice.domain.services.FilmService filmService){
        return new FilmService(filmService);
    }

    @Bean
    public FilmUploadService createBackofficeFilmUploadService(final FilmDao filmDao) {
        return new FilmUploadService(filmDao);
    }

    @Bean
    public FilmDao createBackofficeFilmDao(final FilmJpaRepository filmJpaRepository) {
        return new FilmJpaRepositoryDelegate(filmJpaRepository);
    }

    // ------------------------------------------------------------------------------------------------

    @Bean
    public de.accso.flexinale.backoffice.domain.services.KinoService createBackofficeKinoService(final KinoDao KinoDao) {
        return new de.accso.flexinale.backoffice.domain.services.KinoService(KinoDao);
    }

    @Bean
    public KinoService createApplicationKinoService(final de.accso.flexinale.backoffice.domain.services.KinoService kinoService){
        return new KinoService(kinoService);
    }

    @Bean
    public KinoUploadService createBackofficeKinoUploadService(final KinoDao kinoDao) {
        return new KinoUploadService(kinoDao);
    }

    @Bean
    public KinoSaalUploadService createBackofficeKinoSaalUploadService(final KinoSaalDao kinoSaalDao) {
        return new KinoSaalUploadService(kinoSaalDao);
    }

    @Bean
    public KinoDao createBackofficeKinoDao(final KinoJpaRepository kinoJpaRepository) {
        return new KinoJpaRepositoryDelegate(kinoJpaRepository);
    }

    @Bean
    public KinoSaalDao createBackofficeKinoSaalDao(final KinoSaalJpaRepository kinoSaalJpaRepository) {
        return new KinoSaalJpaRepositoryDelegate(kinoSaalJpaRepository);
    }

    // ------------------------------------------------------------------------------------------------

    @Bean
    public de.accso.flexinale.backoffice.domain.services.VorfuehrungService createBackofficeVorfuehrungService(final VorfuehrungDao vorfuehrungDao) {
        return new de.accso.flexinale.backoffice.domain.services.VorfuehrungService(vorfuehrungDao);
    }

    @Bean
    public VorfuehrungService createApplicationVorfuehrungService(final de.accso.flexinale.backoffice.domain.services.VorfuehrungService vorfuehrungService) {
        return new VorfuehrungService(vorfuehrungService);
    }


    @Bean
    public VorfuehrungUploadService createBackofficeVorfuehrungUploadService(final VorfuehrungDao vorfuehrungDao,
                                                                             final FilmDao filmDao,
                                                                             final KinoSaalDao kinoSaalDao) {
        return new VorfuehrungUploadService(vorfuehrungDao, filmDao, kinoSaalDao);
    }

    @Bean
    public VorfuehrungDao createBackofficeVorfuehrungDao(final VorfuehrungJpaRepository vorfuehrungJpaRepository) {
        return new VorfuehrungJpaRepositoryDelegate(vorfuehrungJpaRepository);
    }

    // ------------------------------------------------------------------------------------------------

    @Bean
    public FilmRetriever createBackofficeFilmRetriever(final FilmDao filmDao) {
        return new FilmRetrieverService(filmDao);
    }

    @Bean
    public KinoRetriever createBackofficeKinoRetriever(final KinoDao kinoDao) {
        return new KinoRetrieverService(kinoDao);
    }

    @Bean
    public VorfuehrungRetriever createBackofficeVorfuehrungRetriever(final VorfuehrungDao vorfuehrungDao) {
        return new VorfuehrungRetrieverService(vorfuehrungDao);
    }
}
