using System.Net.Http;
using System.Net.Http.Json;
using TaxBaik.Application.Services;
using TaxBaik.Domain.Entities;

namespace TaxBaik.Web.Client.Components.Admin.Services;

/// <summary>
/// Admin Dashboard API Client
/// SOLID: Single Responsibility - Dashboard API 호출만 담당
/// Dependency Inversion - 추상화된 인터페이스 사용
/// </summary>
public interface IAdminDashboardClient
{
    Task<AdminDashboardSummary> GetSummaryAsync(CancellationToken ct = default);
    Task<IEnumerable<TaxFiling>> GetUpcomingFilingsAsync(int days = 30, CancellationToken ct = default);
    Task<IEnumerable<Inquiry>> GetRecentInquiriesAsync(int limit = 10, CancellationToken ct = default);
    Task<MonthlyStatsDto> GetMonthlyStatsAsync(string? month = null, CancellationToken ct = default);
}

public class AdminDashboardClient : IAdminDashboardClient
{
    private readonly HttpClient _http;
    private readonly ILogger<AdminDashboardClient> _logger;
    private readonly ITokenStore _tokenStore;

    public AdminDashboardClient(HttpClient http, ILogger<AdminDashboardClient> logger, ITokenStore tokenStore)
    {
        _http = http;
        _logger = logger;
        _tokenStore = tokenStore;
    }

    private void EnsureAuthHeader()
    {
        if (!string.IsNullOrEmpty(_tokenStore.AccessToken))
            _http.DefaultRequestHeaders.Authorization = new("Bearer", _tokenStore.AccessToken);
        else
            _http.DefaultRequestHeaders.Authorization = null;
    }

    public async Task<AdminDashboardSummary> GetSummaryAsync(CancellationToken ct = default)
    {
        try
        {
            EnsureAuthHeader();
            var result = await _http.GetFromJsonAsync<AdminDashboardSummary>(
                "admin-dashboard/summary", cancellationToken: ct);
            return result ?? new(0, 0, 0, 0, []);
        }
        catch (HttpRequestException ex)
        {
            if (ex.StatusCode == System.Net.HttpStatusCode.Unauthorized)
            {
                _logger.LogDebug("Dashboard summary request returned 401; using empty summary");
                return new AdminDashboardSummary(0, 0, 0, 0, []);
            }

            _logger.LogError(ex, "Failed to fetch dashboard summary");
            return new AdminDashboardSummary(0, 0, 0, 0, []);
        }
    }

    public async Task<IEnumerable<TaxFiling>> GetUpcomingFilingsAsync(int days = 30, CancellationToken ct = default)
    {
        try
        {
            EnsureAuthHeader();
            var result = await _http.GetFromJsonAsync<ApiResponse<TaxFiling>>(
                $"admin-dashboard/upcoming-filings?days={days}", cancellationToken: ct);
            return result?.Data ?? [];
        }
        catch (HttpRequestException ex)
        {
            if (ex.StatusCode == System.Net.HttpStatusCode.Unauthorized)
                return [];

            _logger.LogError(ex, "Failed to fetch upcoming filings");
            return [];
        }
    }

    public async Task<IEnumerable<Inquiry>> GetRecentInquiriesAsync(int limit = 10, CancellationToken ct = default)
    {
        try
        {
            EnsureAuthHeader();
            var result = await _http.GetFromJsonAsync<ApiResponse<Inquiry>>(
                $"admin-dashboard/recent-inquiries?limit={limit}", cancellationToken: ct);
            return result?.Data ?? [];
        }
        catch (HttpRequestException ex)
        {
            if (ex.StatusCode == System.Net.HttpStatusCode.Unauthorized)
                return [];

            _logger.LogError(ex, "Failed to fetch recent inquiries");
            return [];
        }
    }

    public async Task<MonthlyStatsDto> GetMonthlyStatsAsync(string? month = null, CancellationToken ct = default)
    {
        try
        {
            EnsureAuthHeader();
            var url = "admin-dashboard/monthly-stats";
            if (!string.IsNullOrEmpty(month))
                url += $"?month={month}";

            var result = await _http.GetFromJsonAsync<MonthlyStatsDto>(url, cancellationToken: ct);
            return result ?? new MonthlyStatsDto();
        }
        catch (HttpRequestException ex)
        {
            if (ex.StatusCode == System.Net.HttpStatusCode.Unauthorized)
                return new MonthlyStatsDto();

            _logger.LogError(ex, "Failed to fetch monthly stats");
            return new MonthlyStatsDto();
        }
    }
}

public sealed class MonthlyStatsDto
{
    public string Month { get; set; } = string.Empty;
    public int TotalInquiries { get; set; }
    public int ConsultingCount { get; set; }
    public int CompletedCount { get; set; }
    public int NewCount { get; set; }
    public double CompletionRate { get; set; }
}

/// <summary>
/// API Response wrapper
/// </summary>
internal class ApiResponse<T>
{
    public IEnumerable<T>? Data { get; set; }
    public int Total { get; set; }
    public int Page { get; set; }
    public int PageSize { get; set; }
}
