import 'package:hive_ce/hive.dart';

import 'package:worker/core/constants/storage_constants.dart';

part 'enums.g.dart';

// ============================================================================
// USER ENUMS
// ============================================================================

/// User Role
///
/// Represents the role of a user in the system.
@HiveType(typeId: HiveTypeIds.userRole)
enum UserRole {
  @HiveField(0)
  customer,

  @HiveField(1)
  distributor,

  @HiveField(2)
  admin,

  @HiveField(3)
  staff,
}

/// User Status
///
/// Represents the account status of a user.
@HiveType(typeId: HiveTypeIds.userStatus)
enum UserStatus {
  @HiveField(0)
  active,

  @HiveField(1)
  inactive,

  @HiveField(2)
  suspended,

  @HiveField(3)
  pending,
}

/// Loyalty Tier Levels
///
/// Represents the loyalty program membership tiers.
/// Higher tiers receive more benefits and rewards.
@HiveType(typeId: HiveTypeIds.loyaltyTier)
enum LoyaltyTier {
  @HiveField(0)
  bronze,

  @HiveField(1)
  silver,

  @HiveField(2)
  gold,

  @HiveField(3)
  platinum,

  @HiveField(4)
  diamond,

  @HiveField(5)
  titan,
}

// ============================================================================
// ORDER ENUMS
// ============================================================================

/// Order Status
///
/// Represents the current state of an order.
@HiveType(typeId: HiveTypeIds.orderStatus)
enum OrderStatus {
  @HiveField(0)
  draft,

  @HiveField(1)
  pending,

  @HiveField(2)
  confirmed,

  @HiveField(3)
  processing,

  @HiveField(4)
  shipped,

  @HiveField(5)
  delivered,

  @HiveField(6)
  completed,

  @HiveField(7)
  cancelled,

  @HiveField(8)
  refunded,
}

// ============================================================================
// INVOICE & PAYMENT ENUMS
// ============================================================================

/// Invoice Type
///
/// Represents the type of invoice.
@HiveType(typeId: HiveTypeIds.invoiceType)
enum InvoiceType {
  @HiveField(0)
  sales,

  @HiveField(1)
  proforma,

  @HiveField(2)
  creditNote,

  @HiveField(3)
  debitNote,
}

/// Invoice Status
///
/// Represents the payment status of an invoice.
@HiveType(typeId: HiveTypeIds.invoiceStatus)
enum InvoiceStatus {
  @HiveField(0)
  draft,

  @HiveField(1)
  issued,

  @HiveField(2)
  partiallyPaid,

  @HiveField(3)
  paid,

  @HiveField(4)
  overdue,

  @HiveField(5)
  cancelled,

  @HiveField(6)
  refunded,
}

/// Payment Method
///
/// Represents available payment methods.
@HiveType(typeId: HiveTypeIds.paymentMethod)
enum PaymentMethod {
  @HiveField(0)
  cash,

  @HiveField(1)
  bankTransfer,

  @HiveField(2)
  creditCard,

  @HiveField(3)
  debitCard,

  @HiveField(4)
  eWallet,

  @HiveField(5)
  cheque,

  @HiveField(6)
  creditTerm,
}

/// Payment Status
///
/// Represents the status of a payment transaction.
@HiveType(typeId: HiveTypeIds.paymentStatus)
enum PaymentStatus {
  @HiveField(0)
  pending,

  @HiveField(1)
  processing,

  @HiveField(2)
  completed,

  @HiveField(3)
  failed,

  @HiveField(4)
  refunded,

  @HiveField(5)
  cancelled,
}

// ============================================================================
// LOYALTY ENUMS
// ============================================================================

/// Entry Type
///
/// Represents the type of loyalty points entry.
@HiveType(typeId: HiveTypeIds.entryType)
enum EntryType {
  @HiveField(0)
  earn,

  @HiveField(1)
  redeem,

  @HiveField(2)
  adjustment,

  @HiveField(3)
  expiry,

  @HiveField(4)
  refund,
}

/// Entry Source
///
/// Represents the source of a loyalty points entry.
@HiveType(typeId: HiveTypeIds.entrySource)
enum EntrySource {
  @HiveField(0)
  purchase,

  @HiveField(1)
  referral,

  @HiveField(2)
  promotion,

  @HiveField(3)
  bonus,

  @HiveField(4)
  giftRedemption,

  @HiveField(5)
  projectSubmission,

  @HiveField(6)
  pointsRecord,

  @HiveField(7)
  manualAdjustment,
}

/// Complaint Status
///
/// Represents the status of a complaint.
@HiveType(typeId: HiveTypeIds.complaintStatus)
enum ComplaintStatus {
  @HiveField(0)
  none,

  @HiveField(1)
  pending,

  @HiveField(2)
  investigating,

  @HiveField(3)
  resolved,

  @HiveField(4)
  rejected,
}

/// Gift Category
///
/// Represents the category of a gift.
@HiveType(typeId: HiveTypeIds.giftCategory)
enum GiftCategory {
  @HiveField(0)
  voucher,

  @HiveField(1)
  product,

  @HiveField(2)
  service,

  @HiveField(3)
  discount,

  @HiveField(4)
  experience,
}

/// Gift Status
///
/// Represents the status of a redeemed gift.
@HiveType(typeId: HiveTypeIds.giftStatus)
enum GiftStatus {
  @HiveField(0)
  active,

  @HiveField(1)
  used,

  @HiveField(2)
  expired,

  @HiveField(3)
  cancelled,
}

/// Points Record Status
///
/// Represents the status of a points record submission.
@HiveType(typeId: HiveTypeIds.pointsStatus)
enum PointsStatus {
  @HiveField(0)
  pending,

  @HiveField(1)
  approved,

  @HiveField(2)
  rejected,
}

// ============================================================================
// PROJECT ENUMS
// ============================================================================

/// Project Type
///
/// Represents the category of construction project.
@HiveType(typeId: HiveTypeIds.projectType)
enum ProjectType {
  @HiveField(0)
  residential,

  @HiveField(1)
  commercial,

  @HiveField(2)
  industrial,

  @HiveField(3)
  infrastructure,

  @HiveField(4)
  renovation,

  @HiveField(5)
  interior,

  @HiveField(6)
  exterior,
}

/// Submission Status
///
/// Represents the status of a project submission.
@HiveType(typeId: HiveTypeIds.submissionStatus)
enum SubmissionStatus {
  @HiveField(0)
  pending,

  @HiveField(1)
  reviewing,

  @HiveField(2)
  approved,

  @HiveField(3)
  rejected,

  @HiveField(4)
  needsRevision,
}

/// Design Status
///
/// Represents the status of a design request.
@HiveType(typeId: HiveTypeIds.designStatus)
enum DesignStatus {
  @HiveField(0)
  pending,

  @HiveField(1)
  assigned,

  @HiveField(2)
  inProgress,

  @HiveField(3)
  reviewing,

  @HiveField(4)
  completed,

  @HiveField(5)
  cancelled,

  @HiveField(6)
  onHold,
}

// ============================================================================
// QUOTE ENUMS
// ============================================================================

/// Quote Status
///
/// Represents the status of a quotation.
@HiveType(typeId: HiveTypeIds.quoteStatus)
enum QuoteStatus {
  @HiveField(0)
  draft,

  @HiveField(1)
  sent,

  @HiveField(2)
  viewed,

  @HiveField(3)
  accepted,

  @HiveField(4)
  rejected,

  @HiveField(5)
  expired,

  @HiveField(6)
  converted,

  @HiveField(7)
  cancelled,
}

// ============================================================================
// CHAT ENUMS
// ============================================================================

/// Room Type
///
/// Represents the type of chat room.
@HiveType(typeId: HiveTypeIds.roomType)
enum RoomType {
  @HiveField(0)
  support,

  @HiveField(1)
  sales,

  @HiveField(2)
  orderInquiry,

  @HiveField(3)
  quoteDiscussion,

  @HiveField(4)
  general,
}

/// Content Type
///
/// Represents the type of message content.
@HiveType(typeId: HiveTypeIds.contentType)
enum ContentType {
  @HiveField(0)
  text,

  @HiveField(1)
  image,

  @HiveField(2)
  file,

  @HiveField(3)
  video,

  @HiveField(4)
  audio,

  @HiveField(5)
  productReference,

  @HiveField(6)
  orderReference,

  @HiveField(7)
  quoteReference,
}

// ============================================================================
// NOTIFICATION ENUMS
// ============================================================================

/// Reminder Type
///
/// Represents the type of payment reminder.
@HiveType(typeId: HiveTypeIds.reminderType)
enum ReminderType {
  @HiveField(0)
  beforeDue,

  @HiveField(1)
  dueDate,

  @HiveField(2)
  overdue,

  @HiveField(3)
  finalNotice,
}

// ============================================================================
// EXTENSION METHODS
// ============================================================================

extension UserRoleExtension on UserRole {
  String get displayName {
    switch (this) {
      case UserRole.customer:
        return 'Khách hàng';
      case UserRole.distributor:
        return 'Đại lý';
      case UserRole.admin:
        return 'Quản trị viên';
      case UserRole.staff:
        return 'Nhân viên';
    }
  }
}

extension UserStatusExtension on UserStatus {
  String get displayName {
    switch (this) {
      case UserStatus.active:
        return 'Hoạt động';
      case UserStatus.inactive:
        return 'Không hoạt động';
      case UserStatus.suspended:
        return 'Tạm khóa';
      case UserStatus.pending:
        return 'Chờ duyệt';
    }
  }
}

extension LoyaltyTierExtension on LoyaltyTier {
  String get displayName {
    switch (this) {
      case LoyaltyTier.bronze:
        return 'Đồng';
      case LoyaltyTier.silver:
        return 'Bạc';
      case LoyaltyTier.gold:
        return 'Vàng';
      case LoyaltyTier.platinum:
        return 'Bạch kim';
      case LoyaltyTier.diamond:
        return 'Kim cương';
      case LoyaltyTier.titan:
        return 'Titan';
    }
  }

  int get level {
    switch (this) {
      case LoyaltyTier.bronze:
        return 1;
      case LoyaltyTier.silver:
        return 2;
      case LoyaltyTier.gold:
        return 3;
      case LoyaltyTier.platinum:
        return 4;
      case LoyaltyTier.diamond:
        return 5;
      case LoyaltyTier.titan:
        return 6;
    }
  }
}

extension OrderStatusExtension on OrderStatus {
  String get displayName {
    switch (this) {
      case OrderStatus.draft:
        return 'Nháp';
      case OrderStatus.pending:
        return 'Chờ xác nhận';
      case OrderStatus.confirmed:
        return 'Đã xác nhận';
      case OrderStatus.processing:
        return 'Đang xử lý';
      case OrderStatus.shipped:
        return 'Đang giao hàng';
      case OrderStatus.delivered:
        return 'Đã giao hàng';
      case OrderStatus.completed:
        return 'Hoàn thành';
      case OrderStatus.cancelled:
        return 'Đã hủy';
      case OrderStatus.refunded:
        return 'Đã hoàn tiền';
    }
  }

  bool get isActive {
    return this == OrderStatus.pending ||
        this == OrderStatus.confirmed ||
        this == OrderStatus.processing ||
        this == OrderStatus.shipped;
  }

  bool get isFinal {
    return this == OrderStatus.completed ||
        this == OrderStatus.cancelled ||
        this == OrderStatus.refunded;
  }
}

extension InvoiceStatusExtension on InvoiceStatus {
  String get displayName {
    switch (this) {
      case InvoiceStatus.draft:
        return 'Nháp';
      case InvoiceStatus.issued:
        return 'Đã phát hành';
      case InvoiceStatus.partiallyPaid:
        return 'Thanh toán 1 phần';
      case InvoiceStatus.paid:
        return 'Đã thanh toán';
      case InvoiceStatus.overdue:
        return 'Quá hạn';
      case InvoiceStatus.cancelled:
        return 'Đã hủy';
      case InvoiceStatus.refunded:
        return 'Đã hoàn tiền';
    }
  }
}

extension PaymentMethodExtension on PaymentMethod {
  String get displayName {
    switch (this) {
      case PaymentMethod.cash:
        return 'Tiền mặt';
      case PaymentMethod.bankTransfer:
        return 'Chuyển khoản';
      case PaymentMethod.creditCard:
        return 'Thẻ tín dụng';
      case PaymentMethod.debitCard:
        return 'Thẻ ghi nợ';
      case PaymentMethod.eWallet:
        return 'Ví điện tử';
      case PaymentMethod.cheque:
        return 'Séc';
      case PaymentMethod.creditTerm:
        return 'Công nợ';
    }
  }
}

extension PaymentStatusExtension on PaymentStatus {
  String get displayName {
    switch (this) {
      case PaymentStatus.pending:
        return 'Chờ xử lý';
      case PaymentStatus.processing:
        return 'Đang xử lý';
      case PaymentStatus.completed:
        return 'Hoàn thành';
      case PaymentStatus.failed:
        return 'Thất bại';
      case PaymentStatus.refunded:
        return 'Đã hoàn tiền';
      case PaymentStatus.cancelled:
        return 'Đã hủy';
    }
  }
}

extension EntryTypeExtension on EntryType {
  String get displayName {
    switch (this) {
      case EntryType.earn:
        return 'Tích điểm';
      case EntryType.redeem:
        return 'Đổi điểm';
      case EntryType.adjustment:
        return 'Điều chỉnh';
      case EntryType.expiry:
        return 'Hết hạn';
      case EntryType.refund:
        return 'Hoàn điểm';
    }
  }

  bool get isPositive {
    return this == EntryType.earn || this == EntryType.refund;
  }

  bool get isNegative {
    return this == EntryType.redeem || this == EntryType.expiry;
  }
}

extension EntrySourceExtension on EntrySource {
  String get displayName {
    switch (this) {
      case EntrySource.purchase:
        return 'Mua hàng';
      case EntrySource.referral:
        return 'Giới thiệu';
      case EntrySource.promotion:
        return 'Khuyến mãi';
      case EntrySource.bonus:
        return 'Thưởng';
      case EntrySource.giftRedemption:
        return 'Đổi quà';
      case EntrySource.projectSubmission:
        return 'Nộp công trình';
      case EntrySource.pointsRecord:
        return 'Ghi nhận điểm';
      case EntrySource.manualAdjustment:
        return 'Điều chỉnh thủ công';
    }
  }
}

extension GiftCategoryExtension on GiftCategory {
  String get displayName {
    switch (this) {
      case GiftCategory.voucher:
        return 'Phiếu quà tặng';
      case GiftCategory.product:
        return 'Sản phẩm';
      case GiftCategory.service:
        return 'Dịch vụ';
      case GiftCategory.discount:
        return 'Giảm giá';
      case GiftCategory.experience:
        return 'Trải nghiệm';
    }
  }
}

extension GiftStatusExtension on GiftStatus {
  String get displayName {
    switch (this) {
      case GiftStatus.active:
        return 'Có hiệu lực';
      case GiftStatus.used:
        return 'Đã sử dụng';
      case GiftStatus.expired:
        return 'Hết hạn';
      case GiftStatus.cancelled:
        return 'Đã hủy';
    }
  }
}

extension ProjectTypeExtension on ProjectType {
  String get displayName {
    switch (this) {
      case ProjectType.residential:
        return 'Dân dụng';
      case ProjectType.commercial:
        return 'Thương mại';
      case ProjectType.industrial:
        return 'Công nghiệp';
      case ProjectType.infrastructure:
        return 'Hạ tầng';
      case ProjectType.renovation:
        return 'Cải tạo';
      case ProjectType.interior:
        return 'Nội thất';
      case ProjectType.exterior:
        return 'Ngoại thất';
    }
  }
}

extension QuoteStatusExtension on QuoteStatus {
  String get displayName {
    switch (this) {
      case QuoteStatus.draft:
        return 'Nháp';
      case QuoteStatus.sent:
        return 'Đã gửi';
      case QuoteStatus.viewed:
        return 'Đã xem';
      case QuoteStatus.accepted:
        return 'Chấp nhận';
      case QuoteStatus.rejected:
        return 'Từ chối';
      case QuoteStatus.expired:
        return 'Hết hạn';
      case QuoteStatus.converted:
        return 'Đã chuyển đổi';
      case QuoteStatus.cancelled:
        return 'Đã hủy';
    }
  }

  bool get isActive {
    return this == QuoteStatus.sent || this == QuoteStatus.viewed;
  }

  bool get isFinal {
    return this == QuoteStatus.accepted ||
        this == QuoteStatus.rejected ||
        this == QuoteStatus.expired ||
        this == QuoteStatus.converted ||
        this == QuoteStatus.cancelled;
  }
}

extension RoomTypeExtension on RoomType {
  String get displayName {
    switch (this) {
      case RoomType.support:
        return 'Hỗ trợ';
      case RoomType.sales:
        return 'Bán hàng';
      case RoomType.orderInquiry:
        return 'Đơn hàng';
      case RoomType.quoteDiscussion:
        return 'Báo giá';
      case RoomType.general:
        return 'Chung';
    }
  }
}

extension ReminderTypeExtension on ReminderType {
  String get displayName {
    switch (this) {
      case ReminderType.beforeDue:
        return 'Trước hạn';
      case ReminderType.dueDate:
        return 'Đến hạn';
      case ReminderType.overdue:
        return 'Quá hạn';
      case ReminderType.finalNotice:
        return 'Thông báo cuối';
    }
  }
}
