@using CMSMicroservice.Protobuf.Protos.Inventory

<MudDialog>
    <DialogContent>
        <MudForm @ref="_form" @bind-IsValid="_formValid">
            <MudStack Spacing="4">
                <MudAlert Severity="Severity.Warning">
                    <MudStack Spacing="1">
                        <MudText>محصول: <strong>@Item.ProductTitle</strong></MudText>
                        <MudText>موجودی فعلی: <strong>@Item.Quantity</strong> عدد</MudText>
                    </MudStack>
                </MudAlert>

                <MudNumericField T="int" @bind-Value="_quantity"
                                 Label="تعداد خسارت دیده"
                                 Variant="Variant.Outlined"
                                 Required="true"
                                 RequiredError="تعداد الزامی است"
                                 Min="1"
                                 Max="@Item.Quantity"
                                 HelperText="@($"حداکثر: {Item.Quantity} عدد")" />

                <MudTextField T="string" @bind-Value="_reason"
                              Label="دلیل خسارت"
                              Variant="Variant.Outlined"
                              Lines="2"
                              Required="true"
                              RequiredError="دلیل خسارت الزامی است"
                              Placeholder="مثال: آسیب در حمل و نقل، منقضی شده، ..." />

                <MudTextField T="string" @bind-Value="_referenceNumber"
                              Label="شماره مرجع"
                              Variant="Variant.Outlined"
                              HelperText="شماره گزارش یا سند داخلی" />

                <MudSelect T="StockMovementType" @bind-Value="_lossType"
                           Label="نوع خسارت"
                           Variant="Variant.Outlined"
                           Required="true"
                           RequiredError="نوع خسارت الزامی است">
                    <MudSelectItem T="StockMovementType" Value="StockMovementType.Loss">خسارت عمومی</MudSelectItem>
                    <MudSelectItem T="StockMovementType" Value="StockMovementType.Damaged">آسیب‌دیده</MudSelectItem>
                    <MudSelectItem T="StockMovementType" Value="StockMovementType.Expired">منقضی شده</MudSelectItem>
                </MudSelect>

                @if (_quantity > 0 && _quantity <= Item.Quantity)
                {
                    <MudAlert Severity="Severity.Error">
                        <MudText>
                            <strong>@_quantity</strong> عدد از موجودی کسر خواهد شد.
                            موجودی جدید: <strong>@(Item.Quantity - _quantity)</strong> عدد
                        </MudText>
                    </MudAlert>
                }
            </MudStack>
        </MudForm>
    </DialogContent>
    <DialogActions>
        <MudButton OnClick="Cancel">انصراف</MudButton>
        <MudButton Color="Color.Error"
                   Variant="Variant.Filled"
                   OnClick="Submit"
                   Disabled="@(!_formValid || _isSubmitting)">
            @if (_isSubmitting)
            {
                <MudProgressCircular Size="Size.Small" Indeterminate="true" Class="mr-2" />
            }
            ثبت خسارت
        </MudButton>
    </DialogActions>
</MudDialog>

@code {
    [CascadingParameter] IMudDialogInstance MudDialog { get; set; } = default!;
    [Inject] public InventoryContract.InventoryContractClient InventoryContract { get; set; } = default!;

    [Parameter] public InventoryItemDto Item { get; set; } = default!;

    private MudForm? _form;
    private bool _formValid;
    private bool _isSubmitting;

    private int _quantity = 1;
    private string _reason = string.Empty;
    private string _referenceNumber = string.Empty;
    private StockMovementType _lossType = StockMovementType.Loss;

    private void Cancel() => MudDialog.Cancel();

    private async Task Submit()
    {
        if (_form != null)
        {
            await _form.Validate();
            if (!_formValid) return;
        }

        if (_quantity > Item.Quantity)
        {
            Snackbar.Add("تعداد خسارت نمی‌تواند از موجودی فعلی بیشتر باشد", Severity.Error);
            return;
        }

        _isSubmitting = true;
        try
        {
            var productId = Item.ProductType == ProductType.RegularProduct 
                ? (Item.ProductId ?? 0) 
                : (Item.DiscountProductId ?? 0);

            var request = new RecordLossRequest
            {
                ProductId = productId,
                ProductType = Item.ProductType,
                Quantity = _quantity,
                LossType = _lossType,
                Reason = _reason ?? string.Empty,
                ReferenceNumber = _referenceNumber ?? string.Empty
            };

            await InventoryContract.RecordLossAsync(request);
            
            Snackbar.Add("خسارت با موفقیت ثبت شد", Severity.Success);
            MudDialog.Close(DialogResult.Ok(true));
        }
        catch (Exception ex)
        {
            Snackbar.Add($"خطا: {ex.Message}", Severity.Error);
        }
        finally
        {
            _isSubmitting = false;
        }
    }
}
