using System.Net.Http.Json; using Microsoft.Extensions.Logging; using LittleShop.Client.Models; namespace LittleShop.Client.Services; public class CustomerService : ICustomerService { private readonly HttpClient _httpClient; private readonly ILogger _logger; public CustomerService(HttpClient httpClient, ILogger logger) { _httpClient = httpClient; _logger = logger; } public async Task> GetCustomerByIdAsync(Guid id) { try { var response = await _httpClient.GetAsync($"api/customers/{id}"); if (response.IsSuccessStatusCode) { var customer = await response.Content.ReadFromJsonAsync(); return ApiResponse.Success(customer!); } var error = await response.Content.ReadAsStringAsync(); return ApiResponse.Failure(error, response.StatusCode); } catch (Exception ex) { _logger.LogError(ex, "Failed to get customer {CustomerId}", id); return ApiResponse.Failure( ex.Message, System.Net.HttpStatusCode.InternalServerError); } } public async Task> GetCustomerByTelegramUserIdAsync(long telegramUserId) { try { var response = await _httpClient.GetAsync($"api/customers/by-telegram/{telegramUserId}"); if (response.IsSuccessStatusCode) { var customer = await response.Content.ReadFromJsonAsync(); return ApiResponse.Success(customer!); } var error = await response.Content.ReadAsStringAsync(); return ApiResponse.Failure(error, response.StatusCode); } catch (Exception ex) { _logger.LogError(ex, "Failed to get customer by Telegram ID {TelegramUserId}", telegramUserId); return ApiResponse.Failure( ex.Message, System.Net.HttpStatusCode.InternalServerError); } } public async Task> CreateCustomerAsync(CreateCustomerRequest request) { try { var response = await _httpClient.PostAsJsonAsync("api/customers", request); if (response.IsSuccessStatusCode) { var customer = await response.Content.ReadFromJsonAsync(); return ApiResponse.Success(customer!); } var error = await response.Content.ReadAsStringAsync(); return ApiResponse.Failure(error, response.StatusCode); } catch (Exception ex) { _logger.LogError(ex, "Failed to create customer"); return ApiResponse.Failure( ex.Message, System.Net.HttpStatusCode.InternalServerError); } } public async Task> GetOrCreateCustomerAsync(CreateCustomerRequest request) { try { var response = await _httpClient.PostAsJsonAsync("api/customers/get-or-create", request); if (response.IsSuccessStatusCode) { var customer = await response.Content.ReadFromJsonAsync(); return ApiResponse.Success(customer!); } var error = await response.Content.ReadAsStringAsync(); return ApiResponse.Failure(error, response.StatusCode); } catch (Exception ex) { _logger.LogError(ex, "Failed to get or create customer"); return ApiResponse.Failure( ex.Message, System.Net.HttpStatusCode.InternalServerError); } } public async Task> UpdateCustomerAsync(Guid id, UpdateCustomerRequest request) { try { var response = await _httpClient.PutAsJsonAsync($"api/customers/{id}", request); if (response.IsSuccessStatusCode) { var customer = await response.Content.ReadFromJsonAsync(); return ApiResponse.Success(customer!); } var error = await response.Content.ReadAsStringAsync(); return ApiResponse.Failure(error, response.StatusCode); } catch (Exception ex) { _logger.LogError(ex, "Failed to update customer {CustomerId}", id); return ApiResponse.Failure( ex.Message, System.Net.HttpStatusCode.InternalServerError); } } public async Task> BlockCustomerAsync(Guid id, string reason) { try { var response = await _httpClient.PostAsJsonAsync($"api/customers/{id}/block", reason); if (response.IsSuccessStatusCode) { return ApiResponse.Success(true); } var error = await response.Content.ReadAsStringAsync(); return ApiResponse.Failure(error, response.StatusCode); } catch (Exception ex) { _logger.LogError(ex, "Failed to block customer {CustomerId}", id); return ApiResponse.Failure( ex.Message, System.Net.HttpStatusCode.InternalServerError); } } public async Task> UnblockCustomerAsync(Guid id) { try { var response = await _httpClient.PostAsync($"api/customers/{id}/unblock", null); if (response.IsSuccessStatusCode) { return ApiResponse.Success(true); } var error = await response.Content.ReadAsStringAsync(); return ApiResponse.Failure(error, response.StatusCode); } catch (Exception ex) { _logger.LogError(ex, "Failed to unblock customer {CustomerId}", id); return ApiResponse.Failure( ex.Message, System.Net.HttpStatusCode.InternalServerError); } } }