using System.Net.Http.Json;
using Front.Program.Models;

namespace Front.Program.Services;

public class APIService
{
    private readonly HttpClient _http;
    

    public APIService(HttpClient http)
    {
        _http = http;
    }

    
    private string ChangeToString<T>(T data)
    {
        if (data == null) return string.Empty;
        var properties = typeof(T).GetProperties();
        var value = properties.Select(p => $"{p.Name}={p.GetValue(data)}");
        return string.Join("&", value);
    }
    
    public async Task<APIResponseStatus<TResponse>?> GetJsonAsync<TResponse,TRequest>(string url, TRequest value)
    {
        string parameter = ChangeToString(value);
        var response = await _http.GetFromJsonAsync<APIResponseStatus<TResponse>>($"{url}?{parameter}");
        return response;
    }
}

/*
dynamic 타입을 사용하면:
타입 안전성이 떨어집니다
컴파일 타임에 오류를 잡을 수 없습니다
런타임에 예상치 못한 오류가 발생할 수 있습니다
현재 Register.razor.cs에서 JsonElement를 사용하는 방식이 더 안전할 수 있습니다. 왜냐하면:
JSON 응답의 구조를 명시적으로 확인할 수 있습니다 (TryGetProperty 사용)
각 속성의 타입을 명확하게 처리할 수 있습니다
예상치 못한 데이터 구조에 대해 더 안전하게 대응할 수 있습니다
*/