package de.accso.flexinale.infrastructure.security.services;

import de.accso.flexinale.application.services.AbstractExcelDataUploadService;
import de.accso.flexinale.domain.dao.AbstractDao;
import de.accso.flexinale.infrastructure.security.BenutzerDao;
import de.accso.flexinale.infrastructure.security.BenutzerEntity;
import de.accso.flexinale.shared_kernel.Versionable;
import jakarta.transaction.Transactional;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.CellType;
import org.apache.poi.ss.usermodel.Row;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

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

    private final BenutzerDao benutzerEntityDao;

    public BenutzerUploadService(final BenutzerDao benutzerEntityDao) {
        this.benutzerEntityDao = benutzerEntityDao;
    }

    @Override
    public AbstractDao<BenutzerEntity> getDao() {
        return benutzerEntityDao;
    }

    @Override
    public String getNameOfExcelDataType() {
        return "Benutzer";
    }

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

        // set authorization roles
        Cell cellRolle = excelRow.getCell(6);
        BenutzerEntity.Rolle rolle;
        if (cellRolle == null || cellRolle.getCellType() == CellType.BLANK) {
            rolle = null;
        }
        else {
            rolle = BenutzerEntity.Rolle.valueOf(cellRolle.getStringCellValue());
        }

        BenutzerEntity benutzer = new BenutzerEntity(
                benutzerId, Versionable.unknownVersion().version(),
                excelRow.getCell(1).getStringCellValue(),
                excelRow.getCell(3).getStringCellValue(),
                excelRow.getCell(4).getStringCellValue(),
                excelRow.getCell(5).getStringCellValue(),
                rolle
        );

        benutzer.encryptAndSetPassword(excelRow.getCell(2).getStringCellValue());

        LOGGER.debug("New Benutzer created: " + benutzer);

        return benutzer;
    }
}
