using System.Text;
using System.Text.Json;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;
using Tiku.Application.PlatformBilling;

namespace Tiku.Api.Controllers;

[ApiController]
[Tags("平台端-账务回调")]
[Route("api/platform-billing/callbacks")]
public sealed class PlatformBillingCallbackController(
    IPlatformBillingNotificationService notificationService) : ControllerBase
{
    [AllowAnonymous]
    [HttpPost("{provider}")]
    [EndpointSummary("处理平台账务支付回调")]
    [EndpointDescription("接收平台账务支付渠道回调，按 provider 归一化后写入通知处理流程。")]
    public async Task<IActionResult> Notify(string provider, CancellationToken cancellationToken)
    {
        Request.EnableBuffering();
        using var reader = new StreamReader(Request.Body, Encoding.UTF8, leaveOpen: true);
        var rawBody = await reader.ReadToEndAsync(cancellationToken);
        Request.Body.Position = 0;
        JsonElement body;
        try
        {
            body = string.IsNullOrWhiteSpace(rawBody)
                ? JsonDocument.Parse("{}").RootElement.Clone()
                : JsonDocument.Parse(rawBody).RootElement.Clone();
        }
        catch (JsonException)
        {
            body = JsonDocument.Parse("{}").RootElement.Clone();
        }
        var normalizedProvider = provider.Trim().ToLowerInvariant().Replace('-', '_');
        await notificationService.ProcessAsync(new PlatformBillingNotification(
            normalizedProvider,
            Request.Headers.ToDictionary(value => value.Key, value => value.Value.ToString(), StringComparer.OrdinalIgnoreCase),
            rawBody,
            body), cancellationToken);
        if (normalizedProvider is "alipay" or "ali_pay")
        {
            return Content("success", "text/plain", Encoding.UTF8);
        }
        return Ok(new { code = "SUCCESS", message = "成功" });
    }
}
