using Bimix.Application.DTOModels;
using Bimix.Application.DTOModels.Common;
using Bimix.UI.Shared.Interfaces;
using Bimix.UI.Shared.Services;
using Microsoft.AspNetCore.Components;
using MudBlazor;


namespace Bimix.UI.Shared.Components;

public partial class ProductListComponent : ComponentBase 
{
    [Inject] private ProductService ProductService { get; set; } = default!;
    [Inject] private IScannerService ScannerService { get; set; } = default!;
    [Inject] private ISnackbar Snackbar { get; set; } = default!;


    private PagedResult<ProductDto>  products = new();
    private ProductFilterRequest filterRequest = new();
    private bool isLoading = false;
    
    protected override async Task OnInitializedAsync()
    {
        await LoadProducts();
    }

    private async Task LoadProducts()
    {
        isLoading = true;

        try
        {
            products = await ProductService.GetProductsAsync(filterRequest);
        }
        catch (Exception ex)
        {
            Console.WriteLine($"Loading products failed: {ex.Message}");
        }
        finally
        {
            isLoading = false;
        }
    }

    private async Task SearchProducts()
    {
        filterRequest.Page = 1;
        await LoadProducts();
    }
    
    private async Task OnPageChanged(int page)
    {
        filterRequest.Page = page;
        await LoadProducts();
    }

    private async Task ClearFilters()
    {
        filterRequest = new ProductFilterRequest();
        await LoadProducts();   
    }
    
    private async Task EditProduct(Guid productId)
    {
        // TODO
        Console.WriteLine($"Edytuj produkt: {productId}");
    }

    private async Task DeleteProduct(Guid productId)
    {
        // TODO
        Console.WriteLine($"Usuń produkt: {productId}");
    }

    private string GetScannerIcon()
    {
        return ScannerService.IsAvailable ? Icons.Material.Filled.CameraAlt : "";
    }

    private async Task OnScannerClick()
    {
        if (!ScannerService.IsAvailable)
        {
            Snackbar.Add("Skaner nie jest dostępny na tej platformie", Severity.Warning);
            return;
        }

        try
        {
            var scannedCode = await ScannerService.ScanBarcodeAsync();
            if (!string.IsNullOrEmpty(scannedCode))
            {
                filterRequest.Ean = scannedCode;
                await SearchProducts();
                Snackbar.Add($"Zeskanowano kod: {scannedCode}", Severity.Success);
            }
        }
        catch (Exception ex)
        {
            System.Diagnostics.Debug.WriteLine($"Scanner error: {ex.Message}");
            Snackbar.Add("Błąd podczas skanowania", Severity.Error);
        }
    }

}