using System.Net.Http.Json; using LittleShop.Client.Models; using Microsoft.Extensions.Logging; namespace LittleShop.Client.Services; public class OrderService : IOrderService { private readonly HttpClient _httpClient; private readonly ILogger _logger; public OrderService(HttpClient httpClient, ILogger logger) { _httpClient = httpClient; _logger = logger; } public async Task> CreateOrderAsync(CreateOrderRequest request) { try { var response = await _httpClient.PostAsJsonAsync("api/orders", request); if (response.IsSuccessStatusCode) { var order = await response.Content.ReadFromJsonAsync(); if (order != null) return ApiResponse.Success(order, response.StatusCode); } var error = await response.Content.ReadAsStringAsync(); return ApiResponse.Failure(error, response.StatusCode); } catch (Exception ex) { _logger.LogError(ex, "Failed to create order"); return ApiResponse.Failure( ex.Message, System.Net.HttpStatusCode.InternalServerError); } } public async Task>> GetOrdersByIdentityAsync(string identityReference) { try { var response = await _httpClient.GetAsync( $"api/orders/by-identity/{Uri.EscapeDataString(identityReference)}"); if (response.IsSuccessStatusCode) { var orders = await response.Content.ReadFromJsonAsync>(); return ApiResponse>.Success(orders ?? new List()); } var error = await response.Content.ReadAsStringAsync(); return ApiResponse>.Failure(error, response.StatusCode); } catch (Exception ex) { _logger.LogError(ex, "Failed to get orders for identity {Identity}", identityReference); return ApiResponse>.Failure( ex.Message, System.Net.HttpStatusCode.InternalServerError); } } public async Task> GetOrderByIdAsync(Guid id) { try { var response = await _httpClient.GetAsync($"api/orders/{id}"); if (response.IsSuccessStatusCode) { var order = await response.Content.ReadFromJsonAsync(); if (order != null) return ApiResponse.Success(order); } var error = await response.Content.ReadAsStringAsync(); return ApiResponse.Failure(error, response.StatusCode); } catch (Exception ex) { _logger.LogError(ex, "Failed to get order {OrderId}", id); return ApiResponse.Failure( ex.Message, System.Net.HttpStatusCode.InternalServerError); } } public async Task> CreatePaymentAsync(Guid orderId, int currency) { try { var request = new CreatePaymentRequest { Currency = currency }; var response = await _httpClient.PostAsJsonAsync( $"api/orders/{orderId}/payments", request); if (response.IsSuccessStatusCode) { var payment = await response.Content.ReadFromJsonAsync(); if (payment != null) return ApiResponse.Success(payment, response.StatusCode); } var error = await response.Content.ReadAsStringAsync(); return ApiResponse.Failure(error, response.StatusCode); } catch (Exception ex) { _logger.LogError(ex, "Failed to create payment for order {OrderId}", orderId); return ApiResponse.Failure( ex.Message, System.Net.HttpStatusCode.InternalServerError); } } public async Task>> GetOrderPaymentsAsync(Guid orderId) { try { var response = await _httpClient.GetAsync($"api/orders/{orderId}/payments"); if (response.IsSuccessStatusCode) { var payments = await response.Content.ReadFromJsonAsync>(); return ApiResponse>.Success(payments ?? new List()); } var error = await response.Content.ReadAsStringAsync(); return ApiResponse>.Failure(error, response.StatusCode); } catch (Exception ex) { _logger.LogError(ex, "Failed to get payments for order {OrderId}", orderId); return ApiResponse>.Failure( ex.Message, System.Net.HttpStatusCode.InternalServerError); } } }