package de.accso.flexinale.backoffice.application.services;

import de.accso.flexinale.backoffice.domain.dao.FilmDao;
import de.accso.flexinale.backoffice.domain.dao.KinoSaalDao;
import de.accso.flexinale.backoffice.domain.dao.VorfuehrungDao;
import de.accso.flexinale.backoffice.domain.model.Film;
import de.accso.flexinale.backoffice.domain.model.KinoSaal;
import de.accso.flexinale.backoffice.domain.model.Vorfuehrung;
import de.accso.flexinale.common.domain.dao.AbstractDao;
import de.accso.flexinale.common.application.services.AbstractExcelDataUploadService;
import de.accso.flexinale.common.shared_kernel.Identifiable;
import jakarta.transaction.Transactional;
import org.apache.poi.ss.usermodel.Row;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.time.LocalDateTime;

@Transactional
public class VorfuehrungUploadService extends AbstractExcelDataUploadService<Vorfuehrung> {
    private static final Logger LOGGER = LoggerFactory.getLogger(VorfuehrungUploadService.class);

    private final FilmDao filmDao;
    private final KinoSaalDao kinoSaalDao;

    private final VorfuehrungDao vorfuehrungDao;

    public VorfuehrungUploadService(final VorfuehrungDao vorfuehrungDao,
                                    final FilmDao filmDao,
                                    final KinoSaalDao kinoSaalDao) {
        this.filmDao = filmDao;
        this.kinoSaalDao = kinoSaalDao;
        this.vorfuehrungDao = vorfuehrungDao;
    }

    @Override
    public AbstractDao<Vorfuehrung> getDao() {
        return vorfuehrungDao;
    }

    @Override
    public String getNameOfExcelDataType() {
        return Vorfuehrung.class.getSimpleName();
    }

    @Override
    public Vorfuehrung createDataFromExcelRow(final Row excelRow) {
        String vorfuehrungId = excelRow.getCell(0).getStringCellValue();

        // expects date/time in format like for example 2023-02-20T17:45
        LocalDateTime zeit = LocalDateTime.parse(excelRow.getCell(1).getStringCellValue());

        String filmId = excelRow.getCell(2).getStringCellValue();
        Film film = filmDao.findById(Identifiable.Id.of(filmId)).orElseThrow(IllegalStateException::new);

        String kinoSaalId = excelRow.getCell(3).getStringCellValue();
        KinoSaal kinoSaal = kinoSaalDao.findById(Identifiable.Id.of(kinoSaalId)).orElseThrow(IllegalStateException::new);

        Vorfuehrung vorfuehrung = new Vorfuehrung(Identifiable.Id.of(vorfuehrungId), new Vorfuehrung.Zeit(zeit), film, kinoSaal);

        LOGGER.debug("New Vorfuehrung created: " + vorfuehrung);

        return vorfuehrung;
    }
}
