package org.initialde.yakasave.Api;

import org.initialde.yakasave.Application.RemoveContributorFromSavingsFund;
import org.initialde.yakasave.Domain.Entities.SavingsFund;
import org.initialde.yakasave.Domain.Entities.User;
import org.initialde.yakasave.Domain.Exceptions.NotExistsSavingsFundException;
import org.initialde.yakasave.Domain.Exceptions.UserNotFoundException;
import org.initialde.yakasave.Infrastructure.Persistence.SavingsFundRepository;
import org.initialde.yakasave.Infrastructure.Persistence.UserRepository;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import java.util.Optional;
import java.util.UUID;

@RestController
@RequestMapping("/savings-fund")
public class RemoveContributorFromSavingsFunController {
    private final SavingsFundRepository savingsFundRepository;
    private final UserRepository userRepository;
    private final RemoveContributorFromSavingsFund removeContributorFromSavingsFund;

    @Autowired
    public RemoveContributorFromSavingsFunController(SavingsFundRepository savingsFundRepository, UserRepository userRepository, RemoveContributorFromSavingsFund removeContributorFromSavingsFund) {
        this.savingsFundRepository = savingsFundRepository;
        this.userRepository = userRepository;
        this.removeContributorFromSavingsFund = removeContributorFromSavingsFund;
    }

    @PatchMapping("/{reference}/contributors/{contributorId}/remove")
    public void removeContributorFromSavingsFund(@PathVariable String reference, @PathVariable UUID contributorId) {
        Optional<SavingsFund> savingsFundOpt = savingsFundRepository.findByReference(reference);
        if (savingsFundOpt.isEmpty()) {
            throw new NotExistsSavingsFundException();
        }
        Optional<User> contributorOpt = userRepository.findById(contributorId);
        if (contributorOpt.isEmpty()) {
            throw new UserNotFoundException();
        }
        var savingsFund = savingsFundOpt.get();
        var contributor = contributorOpt.get();
        removeContributorFromSavingsFund.remove(savingsFund, contributor);
    }
}
