using Microsoft.AspNetCore.Components;
using WebClientTpos.Client.Services;

namespace WebClientTpos.Client.Pages.Pos;

/// <summary>
/// EN: Base class for all POS pages — shift state, offline detection, cart management.
///     Provides ShopId from route parameter so all POS pages use real shop data.
/// VI: Lớp cơ sở cho tất cả trang POS — trạng thái ca, phát hiện offline, quản lý giỏ hàng.
///     Cung cấp ShopId từ route parameter để tất cả trang POS dùng dữ liệu shop thật.
/// </summary>
public abstract class PosBase : ComponentBase
{
    [Inject] protected NavigationManager NavigationManager { get; set; } = default!;
    [Inject] protected AuthService AuthService { get; set; } = default!;
    [Inject] protected AuthStateService AuthState { get; set; } = default!;

    /// <summary>
    /// EN: Shop ID from route — injected into every POS page.
    /// VI: ID cửa hàng từ route — inject vào mọi trang POS.
    /// </summary>
    [Parameter] public Guid ShopId { get; set; }
    
    /// <summary>
    /// EN: Whether POS is in offline mode.
    /// VI: POS có đang ở chế độ offline không.
    /// </summary>
    protected bool IsOffline { get; set; } = false;
    
    /// <summary>
    /// EN: Current shift ID.
    /// VI: ID ca làm việc hiện tại.
    /// </summary>
    protected string? CurrentShiftId { get; set; }
    
    /// <summary>
    /// EN: Staff name (logged-in user).
    /// VI: Tên nhân viên (người đăng nhập).
    /// </summary>
    protected string StaffName { get; set; } = string.Empty;
    
    /// <summary>
    /// EN: Store name.
    /// VI: Tên cửa hàng.
    /// </summary>
    protected string StoreName { get; set; } = string.Empty;
    
    /// <summary>
    /// EN: Whether a shift is currently active.
    /// VI: Ca làm việc có đang hoạt động không.
    /// </summary>
    protected bool HasActiveShift => !string.IsNullOrEmpty(CurrentShiftId);

    /// <summary>
    /// EN: Restore auth session from localStorage on first render.
    /// VI: Khôi phục session xác thực từ localStorage khi render lần đầu.
    /// </summary>
    protected override async Task OnInitializedAsync()
    {
        await AuthService.TryRestoreSessionAsync("staff");
        await base.OnInitializedAsync();
    }

    /// <summary>
    /// EN: Format Vietnamese currency for POS display (compact).
    /// VI: Định dạng tiền tệ VND cho POS (gọn).
    /// </summary>
    protected static string FormatPrice(decimal price)
    {
        return price.ToString("N0") + "₫";
    }

    /// <summary>
    /// EN: Navigate to POS sub-page, preserving the current ShopId in the route.
    /// VI: Điều hướng đến trang con POS, giữ ShopId hiện tại trong route.
    /// </summary>
    protected void NavigateTo(string path)
    {
        NavigationManager.NavigateTo($"/pos/{ShopId}/{path}");
    }
}
