package org.initialde.yakasave.Infrastructure.authentication;

import org.initialde.yakasave.Api.Requests.LoginRequest;
import org.initialde.yakasave.Domain.Entities.User;
import org.initialde.yakasave.Infrastructure.Persistence.UserRepository;
import org.initialde.yakasave.Infrastructure.authentication.Jwt.JwtService;
import org.springframework.security.authentication.AuthenticationManager;
import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
import org.springframework.security.core.Authentication;
import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.stereotype.Service;

@Service
public class AuthenticationGatewayImpl implements AuthenticationGateway {

    private final JwtService tokenGenerator;
    private final UserRepository userRepository;
    private final AuthenticationManager authenticationManager;

    public AuthenticationGatewayImpl(JwtService tokenGenerator,
                                     UserRepository userRepository,
                                     AuthenticationManager authenticationManager) {
        this.tokenGenerator = tokenGenerator;
        this.userRepository = userRepository;
        this.authenticationManager = authenticationManager;
    }

    @Override
    public User getAuthenticatedUser() {
        Authentication authentication = SecurityContextHolder.getContext().getAuthentication();

        String username = authentication.getName();
        return userRepository.findByUsername(username).get();
    }

    @Override
    public String authenticate(LoginRequest loginRequest) {
        Authentication authenticationRequest =
                new UsernamePasswordAuthenticationToken(loginRequest.username(), loginRequest.password());

        Authentication authentication = authenticationManager.authenticate(authenticationRequest);

        SecurityContextHolder.getContext().setAuthentication(authentication);

        return tokenGenerator.generateToken(loginRequest);
    }
}
