package org.initialde.yakasave.Application;

import org.initialde.yakasave.Api.Requests.CreateCollectiveSavingsFundRequest;
import org.initialde.yakasave.Domain.Entities.SavingsFund;
import org.initialde.yakasave.Domain.Entities.User;
import org.initialde.yakasave.Domain.Enums.TypeSavingsFund;
import org.initialde.yakasave.Domain.SavingsFundIdentifierGenerator;
import org.initialde.yakasave.Domain.ValueObject.Amount;
import org.initialde.yakasave.Infrastructure.Persistence.SavingsFundRepository;
import org.initialde.yakasave.Infrastructure.authentication.AuthenticationGateway;
import org.springframework.stereotype.Service;

@Service
public class CreateCollectiveSavingsFund {
    private final SavingsFundRepository savingsFundRepository;
    private final AuthenticationGateway authenticationGateway;
    private final SavingsFundIdentifierGenerator savingsFundIdentifierGenerator;

    public CreateCollectiveSavingsFund(SavingsFundRepository savingsFundRepository,
                                       AuthenticationGateway authenticationGateway,
                                       SavingsFundIdentifierGenerator savingsFundIdentifierGenerator) {
        this.savingsFundRepository = savingsFundRepository;
        this.authenticationGateway = authenticationGateway;
        this.savingsFundIdentifierGenerator = savingsFundIdentifierGenerator;
    }

    public void create(CreateCollectiveSavingsFundRequest createCollectiveSavingsFundRequest) {
        User user = authenticationGateway.getAuthenticatedUser();
        var savingsFund = SavingsFund.builder()
                .owner(user)
                .type(TypeSavingsFund.COLLECTIVE)
                .goalTitle(createCollectiveSavingsFundRequest.goalTitle())
                .goalDescription(createCollectiveSavingsFundRequest.description())
                .goalAmount(createCollectiveSavingsFundRequest.goalAmount())
                .launchDate(createCollectiveSavingsFundRequest.launchDate())
                .deadline(createCollectiveSavingsFundRequest.deadline())
                .reference(savingsFundIdentifierGenerator.generate())
                .needsApproval(createCollectiveSavingsFundRequest.hasRequireApproval())
                .maxAllowedMembers(createCollectiveSavingsFundRequest.maxAllowedMembers())
                .build();

        savingsFundRepository.save(savingsFund);
    }
}
