package com.codebyte.api.auth.service;

import static org.assertj.core.api.Assertions.assertThat;
import static org.assertj.core.api.Assertions.assertThatThrownBy;
import static org.mockito.Mockito.when;

import com.codebyte.api.auth.domain.User;
import com.codebyte.api.auth.repository.UserRepository;
import java.time.Instant;
import java.util.Optional;
import java.util.UUID;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;
import org.mockito.InjectMocks;
import org.mockito.Mock;
import org.mockito.junit.jupiter.MockitoExtension;

@ExtendWith(MockitoExtension.class)
class UserServiceTest {

    @Mock private UserRepository userRepository;
    @InjectMocks private UserService userService;

    @Test
    void should_return_profile_without_password() {
        UUID id = UUID.randomUUID();
        User user = new User("user@example.com", "secretHash");
        user.setId(id);
        user.addRole("ROLE_USER");
        user.activate(Instant.now());
        when(userRepository.findById(id)).thenReturn(Optional.of(user));

        var profile = userService.getProfile(id);

        assertThat(profile.id()).isEqualTo(id);
        assertThat(profile.email()).isEqualTo("user@example.com");
        assertThat(profile.roles()).containsExactly("ROLE_USER");
        assertThat(profile.activatedAccount()).isTrue();
        // A record has exactly these components — none of them is the password.
        assertThat(profile.toString()).doesNotContain("secretHash");
    }

    @Test
    void should_throw_when_principal_missing() {
        UUID id = UUID.randomUUID();
        when(userRepository.findById(id)).thenReturn(Optional.empty());

        assertThatThrownBy(() -> userService.getProfile(id))
                .isInstanceOf(PrincipalNotFoundException.class);
    }
}
