// EN: Staff role and status enumerations.
// VI: Enumeration vai trò và trạng thái nhân viên.

using MerchantService.Domain.SeedWork;

namespace MerchantService.Domain.AggregatesModel.MerchantStaffAggregate;

/// <summary>
/// EN: Represents staff roles within a merchant organization.
/// VI: Đại diện cho các vai trò nhân viên trong tổ chức merchant.
/// </summary>
public class StaffRole : Enumeration
{
    /// <summary>
    /// EN: Cashier - handles payments.
    /// VI: Thu ngân - xử lý thanh toán.
    /// </summary>
    public static readonly StaffRole Cashier = new(1, nameof(Cashier));
    
    /// <summary>
    /// EN: Waiter/Server - serves customers.
    /// VI: Phục vụ - phục vụ khách hàng.
    /// </summary>
    public static readonly StaffRole Waiter = new(2, nameof(Waiter));
    
    /// <summary>
    /// EN: Manager - manages staff and operations.
    /// VI: Quản lý - quản lý nhân viên và hoạt động.
    /// </summary>
    public static readonly StaffRole Manager = new(3, nameof(Manager));
    
    /// <summary>
    /// EN: Admin - full access to merchant features.
    /// VI: Admin - toàn quyền truy cập tính năng merchant.
    /// </summary>
    public static readonly StaffRole Admin = new(4, nameof(Admin));

    /// <summary>
    /// EN: Kitchen - handles food preparation.
    /// VI: Bếp - xử lý chế biến món ăn.
    /// </summary>
    public static readonly StaffRole Kitchen = new(5, nameof(Kitchen));

    /// <summary>
    /// EN: Barista - prepares beverages.
    /// VI: Barista - pha chế đồ uống.
    /// </summary>
    public static readonly StaffRole Barista = new(6, nameof(Barista));

    public StaffRole(int id, string name) : base(id, name)
    {
    }
}

/// <summary>
/// EN: Represents the status of a staff member.
/// VI: Đại diện cho trạng thái của nhân viên.
/// </summary>
public class StaffStatus : Enumeration
{
    /// <summary>
    /// EN: Invited but not yet accepted.
    /// VI: Đã mời nhưng chưa chấp nhận.
    /// </summary>
    public static readonly StaffStatus Invited = new(1, nameof(Invited));
    
    /// <summary>
    /// EN: Active staff member.
    /// VI: Nhân viên đang hoạt động.
    /// </summary>
    public static readonly StaffStatus Active = new(2, nameof(Active));
    
    /// <summary>
    /// EN: Temporarily inactive.
    /// VI: Tạm thời không hoạt động.
    /// </summary>
    public static readonly StaffStatus Inactive = new(3, nameof(Inactive));
    
    /// <summary>
    /// EN: Employment terminated.
    /// VI: Đã chấm dứt hợp đồng.
    /// </summary>
    public static readonly StaffStatus Terminated = new(4, nameof(Terminated));

    public StaffStatus(int id, string name) : base(id, name)
    {
    }
}

/// <summary>
/// EN: Staff permissions bitmask.
/// VI: Bitmask quyền hạn nhân viên.
/// </summary>
[Flags]
public enum StaffPermissions
{
    /// <summary>
    /// EN: No permissions.
    /// VI: Không có quyền.
    /// </summary>
    None = 0,
    
    /// <summary>
    /// EN: View sales data.
    /// VI: Xem dữ liệu bán hàng.
    /// </summary>
    ViewSales = 1,
    
    /// <summary>
    /// EN: Process payment transactions.
    /// VI: Xử lý giao dịch thanh toán.
    /// </summary>
    ProcessPayment = 2,
    
    /// <summary>
    /// EN: Process refunds.
    /// VI: Xử lý hoàn tiền.
    /// </summary>
    RefundOrder = 4,
    
    /// <summary>
    /// EN: Manage inventory.
    /// VI: Quản lý kho.
    /// </summary>
    ManageInventory = 8,
    
    /// <summary>
    /// EN: View reports and analytics.
    /// VI: Xem báo cáo và phân tích.
    /// </summary>
    ViewReports = 16,
    
    /// <summary>
    /// EN: Manage other staff members.
    /// VI: Quản lý nhân viên khác.
    /// </summary>
    ManageStaff = 32,
    
    /// <summary>
    /// EN: Manage shop settings.
    /// VI: Quản lý cài đặt shop.
    /// </summary>
    ManageSettings = 64,
    
    /// <summary>
    /// EN: All permissions.
    /// VI: Tất cả quyền.
    /// </summary>
    All = int.MaxValue
}

/// <summary>
/// EN: Shop role for staff assignment at shop level.
/// VI: Vai trò tại shop cho việc gán nhân viên ở cấp shop.
/// </summary>
public class ShopRole : Enumeration
{
    /// <summary>
    /// EN: Cashier role at shop level.
    /// VI: Vai trò thu ngân ở cấp shop.
    /// </summary>
    public static readonly ShopRole Cashier = new(1, nameof(Cashier));
    
    /// <summary>
    /// EN: Waiter role at shop level.
    /// VI: Vai trò phục vụ ở cấp shop.
    /// </summary>
    public static readonly ShopRole Waiter = new(2, nameof(Waiter));
    
    /// <summary>
    /// EN: Manager role at shop level.
    /// VI: Vai trò quản lý ở cấp shop.
    /// </summary>
    public static readonly ShopRole Manager = new(3, nameof(Manager));
    
    /// <summary>
    /// EN: Owner role at shop level (merchant themselves).
    /// VI: Vai trò chủ sở hữu ở cấp shop (chính merchant).
    /// </summary>
    public static readonly ShopRole Owner = new(4, nameof(Owner));

    /// <summary>
    /// EN: Kitchen role at shop level.
    /// VI: Vai trò bếp ở cấp shop.
    /// </summary>
    public static readonly ShopRole Kitchen = new(5, nameof(Kitchen));

    /// <summary>
    /// EN: Barista role at shop level.
    /// VI: Vai trò pha chế ở cấp shop.
    /// </summary>
    public static readonly ShopRole Barista = new(6, nameof(Barista));

    public ShopRole(int id, string name) : base(id, name)
    {
    }
}
