package org.initialde.yakasave.Application;

import org.initialde.yakasave.Api.Requests.CreatePersonalSavingsFundRequest;
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.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

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

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

    public void create(CreatePersonalSavingsFundRequest createPersonalSavingsFundRequest) {
        User user = authenticationGateway.getAuthenticatedUser();
        var savingsFund = SavingsFund.builder()
                .goalTitle(createPersonalSavingsFundRequest.goalTitle())
                .owner(user)
                .type(TypeSavingsFund.PERSONAL)
                .goalAmount(createPersonalSavingsFundRequest.goalAmount())
                .launchDate(createPersonalSavingsFundRequest.launchDate())
                .deadline(createPersonalSavingsFundRequest.deadline())
                .reference(this.savingsFundIdentifierGenerator.generate())
                .build();
        savingsFundRepository.save(savingsFund);
    }
}
