using System.Net.Http.Json;
using System.Text.Encodings.Web;
using System.Text.Json;
using Front.Program.Models;
using Microsoft.JSInterop;

namespace Front.Program.Services;

public class APIService(HttpClient http, 
    StorageService storageService,
    SecureService secureService,
    IJSRuntime js)
{


    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;
    }
    
    public async Task<(bool success, string? json, T? data)> GetConnectServerAsnyc<T>(string url) {
        var headerValue = await storageService.GetItemAsync("Web-AM-Connect-Key");
        if (string.IsNullOrEmpty(headerValue)) return (false, null,default);
        
        var args = new {
            url = $"{url}",
            method = "GET",
            headerKey = "Web-AM-Connect-Key",
            headerValue = headerValue,
            token = "VO00"
        };
        
        var response = await js.InvokeAsync<JsonElement>(
            "fetchWithHeaderAndReturnUrl",
            args
        );
        
        LoggerService.Write($"JSON 응답: {response.ToString()}");

        if (response.TryGetProperty("data", out var dataElement))
        {
            try
            {
                // 전체 데이터 암호화 저장
                var dataJson = dataElement.ToString();
                var serialData = JsonSerializer.Deserialize<T>(dataJson,
                    new JsonSerializerOptions { PropertyNameCaseInsensitive = true });
                LoggerService.Write("[GetConnectServerAsnyc] 사용자 데이터 Json: " + dataJson + dataJson.GetType());
                LoggerService.Write("[GetConnectServerAsnyc] 사용자 데이터 변환: " + serialData.ToString());;
                
                if (serialData != null)
                {
                    var encryptedData = await secureService.EncryptAsync(dataJson);
                    // await storageService.SetItemAsync("USER_DATA", encryptedData);
                    return (true, encryptedData, serialData);
                }
                else
                {
                    LoggerService.Write("사용자 데이터에 필수 정보가 없습니다");
                }
            }
            catch (Exception ex)
            {
                LoggerService.Write($"사용자 데이터 처리 중 오류: {ex.Message}");
            }
        }
        
        LoggerService.Write("데이터를 찾을 수 없습니다");
        return (false, null, default);
    }

}

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