namespace CMSMicroservice.Application.Common.Services;

/// <summary>
/// سرویس محاسبه مالیات بر ارزش افزوده (VAT)
/// </summary>
public static class VatCalculator
{
    /// <summary>
    /// نرخ VAT ایران - 10 درصد
    /// </summary>
    public const decimal VAT_RATE = 0.10m;
    
    /// <summary>
    /// نرخ VAT به صورت درصد (10)
    /// </summary>
    public const int VAT_PERCENT = 10;

    /// <summary>
    /// محاسبه VAT از مبلغ خالص
    /// </summary>
    /// <param name="netAmount">مبلغ خالص (بدون مالیات)</param>
    /// <returns>مبلغ VAT</returns>
    public static long CalculateVat(long netAmount)
    {
        return (long)(netAmount * VAT_RATE);
    }

    /// <summary>
    /// محاسبه مبلغ ناخالص (شامل VAT) از مبلغ خالص
    /// </summary>
    /// <param name="netAmount">مبلغ خالص</param>
    /// <returns>مبلغ ناخالص (خالص + VAT)</returns>
    public static long CalculateGrossAmount(long netAmount)
    {
        return netAmount + CalculateVat(netAmount);
    }

    /// <summary>
    /// استخراج مبلغ خالص از مبلغ ناخالص
    /// </summary>
    /// <param name="grossAmount">مبلغ ناخالص (شامل VAT)</param>
    /// <returns>مبلغ خالص</returns>
    public static long ExtractNetAmount(long grossAmount)
    {
        return (long)(grossAmount / (1 + VAT_RATE));
    }

    /// <summary>
    /// استخراج VAT از مبلغ ناخالص
    /// </summary>
    /// <param name="grossAmount">مبلغ ناخالص (شامل VAT)</param>
    /// <returns>مبلغ VAT</returns>
    public static long ExtractVatFromGross(long grossAmount)
    {
        return grossAmount - ExtractNetAmount(grossAmount);
    }

    /// <summary>
    /// جزئیات محاسبه VAT
    /// </summary>
    public record VatBreakdown(
        long NetAmount,
        long VatAmount,
        long GrossAmount,
        decimal VatRate
    );

    /// <summary>
    /// محاسبه کامل جزئیات VAT
    /// </summary>
    /// <param name="netAmount">مبلغ خالص</param>
    /// <returns>جزئیات کامل VAT</returns>
    public static VatBreakdown CalculateBreakdown(long netAmount)
    {
        var vatAmount = CalculateVat(netAmount);
        return new VatBreakdown(
            NetAmount: netAmount,
            VatAmount: vatAmount,
            GrossAmount: netAmount + vatAmount,
            VatRate: VAT_RATE
        );
    }
}
