package profiles.presentation.viewmodel import android.net.Uri import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope import dagger.hilt.android.lifecycle.HiltViewModel import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.StateFlow import kotlinx.coroutines.flow.asStateFlow import kotlinx.coroutines.launch import profiles.data.remote.dto.ProfileDto import profiles.domain.repository.ProfileRepository import javax.inject.Inject data class ProfileState( val profile: ProfileDto? = null, val isLoading: Boolean = false, val error: String? = null, val isSaving: Boolean = false ) @HiltViewModel class ProfileViewModel @Inject constructor( private val repository: ProfileRepository ) : ViewModel() { private val _state = MutableStateFlow(ProfileState()) val state: StateFlow = _state.asStateFlow() fun loadProfile(id: String? = null) { viewModelScope.launch { _state.value = _state.value.copy(isLoading = true) val result = if (id == null) { repository.getMyProfile() } else { repository.getProfile(id) } result.onSuccess { profile -> _state.value = _state.value.copy(profile = profile, isLoading = false) }.onFailure { error -> _state.value = _state.value.copy(error = error.message, isLoading = false) } } } fun updateProfile(displayName: String?, bio: String?, birthday: String? = null, avatarUri: Uri? = null) { viewModelScope.launch { _state.value = _state.value.copy(isSaving = true, error = null) try { // 1. Обновляем аватар, если он выбран avatarUri?.let { uri -> repository.uploadAvatar(uri).onFailure { error -> throw Exception(error.message ?: "Failed to upload avatar") } } // 2. Обновляем текстовые данные // Пустую строку преобразуем в null для даты рождения val birthdayToSend = if (birthday.isNullOrBlank()) null else birthday // Логирование для отладки android.util.Log.d("ProfileViewModel", "updateProfile: displayName=$displayName, bio=$bio, birthday=$birthday, birthdayToSend=$birthdayToSend") repository.updateProfile(displayName, bio, birthdayToSend) .onSuccess { updatedProfile -> android.util.Log.d("ProfileViewModel", "updateProfile success: birthday=${updatedProfile.birthday}") _state.value = _state.value.copy(profile = updatedProfile, isSaving = false) } .onFailure { error -> android.util.Log.e("ProfileViewModel", "updateProfile error: ${error.message}") _state.value = _state.value.copy(error = error.message, isSaving = false) } } catch (e: Exception) { android.util.Log.e("ProfileViewModel", "updateProfile exception: ${e.message}") _state.value = _state.value.copy(error = e.message, isSaving = false) } } } fun removeAvatar() { viewModelScope.launch { repository.removeAvatar().onSuccess { updatedProfile -> _state.value = _state.value.copy(profile = updatedProfile) } } } }