using System.Net.Http.Json; using LittleShop.Client.Models; using Microsoft.Extensions.Logging; namespace LittleShop.Client.Services; public class CatalogService : ICatalogService { private readonly HttpClient _httpClient; private readonly ILogger _logger; public CatalogService(HttpClient httpClient, ILogger logger) { _httpClient = httpClient; _logger = logger; } public async Task>> GetCategoriesAsync() { try { var response = await _httpClient.GetAsync("api/catalog/categories"); if (response.IsSuccessStatusCode) { var categories = await response.Content.ReadFromJsonAsync>(); return ApiResponse>.Success(categories ?? new List()); } var error = await response.Content.ReadAsStringAsync(); return ApiResponse>.Failure(error, response.StatusCode); } catch (Exception ex) { _logger.LogError(ex, "Failed to get categories"); return ApiResponse>.Failure( ex.Message, System.Net.HttpStatusCode.InternalServerError); } } public async Task> GetCategoryByIdAsync(Guid id) { try { var response = await _httpClient.GetAsync($"api/catalog/categories/{id}"); if (response.IsSuccessStatusCode) { var category = await response.Content.ReadFromJsonAsync(); if (category != null) return ApiResponse.Success(category); } var error = await response.Content.ReadAsStringAsync(); return ApiResponse.Failure(error, response.StatusCode); } catch (Exception ex) { _logger.LogError(ex, "Failed to get category {CategoryId}", id); return ApiResponse.Failure( ex.Message, System.Net.HttpStatusCode.InternalServerError); } } public async Task>> GetProductsAsync( int pageNumber = 1, int pageSize = 20, Guid? categoryId = null, string? searchTerm = null, decimal? minPrice = null, decimal? maxPrice = null) { try { var queryParams = new List { $"pageNumber={pageNumber}", $"pageSize={pageSize}" }; if (categoryId.HasValue) queryParams.Add($"categoryId={categoryId.Value}"); if (!string.IsNullOrEmpty(searchTerm)) queryParams.Add($"search={Uri.EscapeDataString(searchTerm)}"); if (minPrice.HasValue) queryParams.Add($"minPrice={minPrice.Value}"); if (maxPrice.HasValue) queryParams.Add($"maxPrice={maxPrice.Value}"); var queryString = string.Join("&", queryParams); var response = await _httpClient.GetAsync($"api/catalog/products?{queryString}"); if (response.IsSuccessStatusCode) { var result = await response.Content.ReadFromJsonAsync>(); if (result != null) return ApiResponse>.Success(result); } var error = await response.Content.ReadAsStringAsync(); return ApiResponse>.Failure(error, response.StatusCode); } catch (Exception ex) { _logger.LogError(ex, "Failed to get products"); return ApiResponse>.Failure( ex.Message, System.Net.HttpStatusCode.InternalServerError); } } public async Task> GetProductByIdAsync(Guid id) { try { var response = await _httpClient.GetAsync($"api/catalog/products/{id}"); if (response.IsSuccessStatusCode) { var product = await response.Content.ReadFromJsonAsync(); if (product != null) return ApiResponse.Success(product); } var error = await response.Content.ReadAsStringAsync(); return ApiResponse.Failure(error, response.StatusCode); } catch (Exception ex) { _logger.LogError(ex, "Failed to get product {ProductId}", id); return ApiResponse.Failure( ex.Message, System.Net.HttpStatusCode.InternalServerError); } } public async Task>> GetAvailableCurrenciesAsync() { try { var response = await _httpClient.GetAsync("api/currency/available"); if (response.IsSuccessStatusCode) { var currencies = await response.Content.ReadFromJsonAsync>(); return ApiResponse>.Success(currencies ?? new List()); } var error = await response.Content.ReadAsStringAsync(); return ApiResponse>.Failure(error, response.StatusCode); } catch (Exception ex) { _logger.LogError(ex, "Failed to get available currencies"); return ApiResponse>.Failure( ex.Message, System.Net.HttpStatusCode.InternalServerError); } } }