using CMSMicroservice.Application.Common.Interfaces;
using Microsoft.Extensions.Logging;

namespace CMSMicroservice.Infrastructure.Services.Payment;

/// <summary>
/// Mock Implementation برای شبیه‌سازی درگاه پرداخت
/// این سرویس فقط برای تست و توسعه است
/// </summary>
public class MockPaymentGatewayService : IPaymentGatewayService
{
    private readonly ILogger<MockPaymentGatewayService> _logger;

    public MockPaymentGatewayService(ILogger<MockPaymentGatewayService> logger)
    {
        _logger = logger;
    }

    public async Task<PaymentInitiateResult> InitiatePaymentAsync(
        PaymentRequest request, 
        CancellationToken cancellationToken = default)
    {
        _logger.LogWarning("⚠️ Using MOCK Payment Gateway - Replace with real implementation in production!");
        
        // شبیه‌سازی تاخیر شبکه
        await Task.Delay(200, cancellationToken);
        
        // شبیه‌سازی RefId
        var refId = $"MOCK-PAY-{DateTime.Now.Ticks}";
        
        _logger.LogInformation("Mock payment initiated: RefId={RefId}, Amount={Amount}, User={UserId}", 
            refId, request.Amount, request.UserId);
        
        return new PaymentInitiateResult
        {
            IsSuccess = true,
            RefId = refId,
            GatewayUrl = $"https://mock-gateway.local/pay?ref={refId}",
            ErrorMessage = null
        };
    }

    public async Task<PaymentVerificationResult> VerifyPaymentAsync(
        string refId, 
        string verificationToken, 
        CancellationToken cancellationToken = default)
    {
        _logger.LogWarning("⚠️ Using MOCK Payment Gateway - Verification");
        
        // شبیه‌سازی تاخیر شبکه
        await Task.Delay(150, cancellationToken);
        
        // شبیه‌سازی: همه تراکنش‌ها موفق هستند
        var isSuccess = true;
        var trackingCode = $"TRK-{DateTime.Now.Ticks}";
        
        if (isSuccess)
        {
            _logger.LogInformation("Mock payment verified successfully: RefId={RefId}, Tracking={TrackingCode}", 
                refId, trackingCode);
        }
        else
        {
            _logger.LogWarning("Mock payment verification failed: RefId={RefId}", refId);
        }
        
        return new PaymentVerificationResult
        {
            IsSuccess = isSuccess,
            RefId = refId,
            TrackingCode = trackingCode,
            Amount = 0, // باید از Database بیاید
            Message = isSuccess ? "تراکنش موفق (Mock)" : "تراکنش ناموفق (Mock)"
        };
    }

    public Task<PaymentVerificationResult> VerifyPaymentAsync(
        string refId,
        string verificationToken,
        decimal amountInToman,
        CancellationToken cancellationToken = default)
    {
        // Mock: مبلغ تفاوتی نمی‌کند، از همان overload بدون مبلغ استفاده می‌شود
        return VerifyPaymentAsync(refId, verificationToken, cancellationToken);
    }

    public async Task<PayoutResult> ProcessPayoutAsync(
        PayoutRequest request, 
        CancellationToken cancellationToken = default)
    {
        _logger.LogWarning("⚠️ Using MOCK Payment Gateway - Payout");
        
        // شبیه‌سازی تاخیر شبکه
        await Task.Delay(300, cancellationToken);
        
        // Validation: چک کردن شبا (باید IR بخوره و 26 کاراکتر باشد)
        if (!request.Iban.StartsWith("IR") || request.Iban.Length != 26)
        {
            _logger.LogError("Invalid IBAN format: {Iban}", request.Iban);
            return new PayoutResult
            {
                IsSuccess = false,
                Message = "فرمت شماره شبا نامعتبر است",
                ProcessedAt = DateTime.Now
            };
        }
        
        // Validation: چک کردن مبلغ (حداقل 10,000 تومان)
        if (request.Amount < 10_000)
        {
            _logger.LogError("Payout amount too low: {Amount}", request.Amount);
            return new PayoutResult
            {
                IsSuccess = false,
                Message = "حداقل مبلغ برداشت 10,000 تومان است",
                ProcessedAt = DateTime.Now
            };
        }
        
        // شبیه‌سازی: همه واریزها موفق هستند
        var bankRefId = $"BANK-{DateTime.Now.Ticks}";
        var trackingCode = $"TRK-PAYOUT-{DateTime.Now.Ticks}";
        
        _logger.LogInformation(
            "Mock payout processed successfully: User={UserId}, Amount={Amount}, IBAN={Iban}, BankRef={BankRefId}", 
            request.UserId, request.Amount, request.Iban, bankRefId);
        
        return new PayoutResult
        {
            IsSuccess = true,
            BankRefId = bankRefId,
            TrackingCode = trackingCode,
            Message = $"واریز {request.Amount:N0} تومان به حساب {request.Iban} با موفقیت انجام شد (Mock)",
            ProcessedAt = DateTime.Now
        };
    }
}
