package org.initialde.yakasave.Infrastructure.Persistence;

import org.initialde.yakasave.Domain.Entities.SavingsFund;
import org.initialde.yakasave.Domain.Entities.User;
import org.initialde.yakasave.Domain.Enums.TypeSavingsFund;
import org.springframework.stereotype.Repository;

import java.util.List;
import java.util.Optional;

@Repository
public class SavingsFundRepositoryImpl implements SavingsFundRepository {
    private final JpaSavingsFundRepository jpaSavingsFundRepository;

    public SavingsFundRepositoryImpl(JpaSavingsFundRepository jpaSavingsFundRepository) {
        this.jpaSavingsFundRepository = jpaSavingsFundRepository;
    }

    @Override
    public void save(SavingsFund savingsFund) {
        jpaSavingsFundRepository.save(savingsFund.takeSnapshot());
    }

    @Override
    public boolean existsByReference(String reference) {
        return jpaSavingsFundRepository.existsByReference(reference);
    }

    @Override
    public List<SavingsFund> findAllByTypeAndOwner(TypeSavingsFund type, User user) {
        return jpaSavingsFundRepository.findAllByTypeAndOwner(type, user).stream().map(SavingsFund::restoreFromSnapshot).toList();
    }

    @Override
    public void deleteAll() {
        jpaSavingsFundRepository.deleteAll();
    }

    @Override
    public Optional<SavingsFund> findByReference(String reference) {
        return jpaSavingsFundRepository.findByReference(reference).map(SavingsFund::restoreFromSnapshot);
    }
}
