package com.sn.sowsysrestapi.domain.service;

import com.sn.sowsysrestapi.domain.entity.ProfilePicture;
import com.sn.sowsysrestapi.domain.exception.ProfilePictureNotFoundException;
import com.sn.sowsysrestapi.domain.repository.ProfilePictureRepo;
import com.sn.sowsysrestapi.domain.repository.UserRepo;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.io.InputStream;
import java.util.Optional;

@Service
public class ProfilePictureService {

    @Autowired
    private UserRepo userRepo;

    @Autowired
    private ProfilePictureRepo profilePictureRepo;

    @Autowired
    private PictureStorageService pictureStorageService;

    @Transactional
    public ProfilePicture save(ProfilePicture picture, InputStream filesData) {

        String userCode = picture.getUserCode();
        String newFileName = pictureStorageService.generateFileName(picture.getFileName());
        String existentFileName = null;

        Optional<ProfilePicture> existentPicture = profilePictureRepo.findPictureByOwnerCode(userCode);

        if (existentPicture.isPresent()) {
            existentFileName = existentPicture.get().getFileName();
            profilePictureRepo.delete(existentPicture.get());
        }

        picture.setFileName(newFileName);
        picture = profilePictureRepo.save(picture);
        userRepo.flush();

        PictureStorageService.NewPicture newPicture = PictureStorageService.NewPicture.builder()
                .fileName(picture.getFileName())
                .inputStream(filesData)
                .build();

        pictureStorageService.replace(existentFileName, newPicture);

        return picture;

    }

    public ProfilePicture findOrFail(String userCode) {
        return profilePictureRepo.findPictureByOwnerCode(userCode)
                .orElseThrow(() -> new ProfilePictureNotFoundException(userCode));
    }

    @Transactional
    public void delete(String userCode) {

        ProfilePicture picture = findOrFail(userCode);

        profilePictureRepo.delete(picture);
        userRepo.flush();

        pictureStorageService.remove(picture.getFileName());

    }


}
