package testdata;

import de.accso.flexinale.FlexinaleModulith2ComponentsApplication;
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.domain.dao.FilmDao;
import de.accso.flexinale.backoffice.domain.dao.KinoDao;
import de.accso.flexinale.backoffice.domain.dao.VorfuehrungDao;
import de.accso.flexinale.security.infrastructure.persistence.BenutzerDao;
import de.accso.flexinale.security.infrastructure.services.BenutzerUploadService;
import de.accso.flexinale.common.shared_kernel.DoNotCheckInArchitectureTests;
import de.accso.flexinale.ticketing_api_contract.api_contract.Ticketing;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.annotation.DirtiesContext;

import java.io.IOException;

import static org.assertj.core.api.Assertions.assertThat;

@SpringBootTest(classes = {FlexinaleModulith2ComponentsApplication.class})
@DirtiesContext(classMode = DirtiesContext.ClassMode.BEFORE_CLASS)
@DoNotCheckInArchitectureTests
@SuppressWarnings("NewClassNamingConvention")
class AllTestDataLoader {

    @Autowired
    private BenutzerUploadService benutzerUploadService;

    @Autowired
    private BenutzerDao benutzerDao;

    @Autowired
    private KinoUploadService kinoUploadService;

    @Autowired
    private KinoSaalUploadService kinoSaalUploadService;

    @Autowired
    private FilmUploadService filmUploadService;

    @Autowired
    private VorfuehrungUploadService vorfuehrungUploadService;

    @Autowired
    private KinoDao kinoDao;

    @Autowired
    private FilmDao filmDao;

    @Autowired
    private VorfuehrungDao vorfuehrungDao;

    @Autowired
    private Ticketing ticketing;

    @Value("${spring.jpa.hibernate.ddl-auto}")
    private String springJpaHibernateDdlAuto;

    @Test
    void loadAllBenutzerAndFilmeAndKinosAndVorfuehrungenAndTicketsAndKontingenteFromDatabase() throws IOException {
        // All data in the database is automatically deleted because of the property
        //     spring.jpa.hibernate.ddl-auto=create
        // in the test application.properties
        assertThat(springJpaHibernateDdlAuto).isEqualTo("create");


        BenutzerTestDataLoader.internal_loadBenutzerTestDataAndPersistToDatabase(
                benutzerUploadService, benutzerDao);

        FKKsVTestDataLoader.internal_loadFilmeTestDataAndPersistToDatabase(
                filmUploadService, filmDao);
        FKKsVTestDataLoader.internal_loadKinosAndKinoSaeleTestDataAndPersistToDatabase(
                kinoSaalUploadService, kinoUploadService, kinoDao);
        FKKsVTestDataLoader.internal_loadVorfuehrungenTestDataAndPersistToDatabase(
                vorfuehrungUploadService, vorfuehrungDao, ticketing);
    }
}
