export type ReferralStatus = 'PENDING' | 'ACTIVE' | 'REWARDED' | 'EXPIRED';
export type RewardStatus = 'PENDING' | 'APPLIED' | 'EXPIRED';

export interface ReferralRelationship {
  id: string;
  referrerTenantId: string;
  referredTenantId: string;
  referralCode: string;
  level: number;
  status: ReferralStatus;
  registeredAt: string;
  activatedAt: string | null;
  rewardedAt: string | null;
}

export interface ReferralReward {
  id: string;
  beneficiaryTenantId: string;
  referralRelationshipId: string;
  rewardType: 'CREDIT' | 'PERCENTAGE';
  triggerType: 'FIRST_PAYMENT' | 'RECURRING';
  amountCents: number;
  amountFormatted: string;
  status: RewardStatus;
  invoiceId: string | null;
  sourceInvoiceId: string | null;
  recurringMonth: number | null;
  createdAt: string;
  appliedAt: string | null;
}

export interface ReferralAdminStats {
  totalReferrals: number;
  activeReferrals: number;
  pendingRewards: number;
}

export interface PaginatedResult<T> {
  items: T[];
  total: number;
}

// ── User-level / personal circle (C2C) ────────────────────────────────────────

export type UserReferralStatus = 'PENDING' | 'ACTIVE' | 'REWARDED' | 'EXPIRED';

export interface UserCircleRelationship {
  id: string;
  referrerUserId: string;
  referredUserId: string;
  referralCode: string;
  level: number;
  status: UserReferralStatus;
  activatedAt: string | null;
  rewardedAt: string | null;
  createdAt: string;
}

export type PointTransactionType =
  | 'REFERRAL_FIRST_PAYMENT'
  | 'REFERRAL_RECURRING'
  | 'REFERRAL_L2'
  | 'REFERRAL_WELCOME'
  | 'REDEMPTION_QUOTA'
  | 'REDEMPTION_UNLOCK'
  | 'ADMIN_GRANT'
  | 'EXPIRY';

export interface UserPointTransaction {
  id: string;
  userId: string;
  delta: number;
  type: PointTransactionType;
  refId: string | null;
  note: string | null;
  createdAt: string;
}

export interface UserPointBalance {
  userId: string;
  balance: number;
  totalEarned: number;
  totalSpent: number;
  updatedAt: string;
}

export interface ReferralAdminStatsExtended extends ReferralAdminStats {
  totalUserCircles: number;
  totalPointTransactions: number;
}
