export type PromoCodeCampaign = {
  id: string;
  name: string;
  created_by: string | null;
  updated_by: string | null;
  created_at: string;
  updated_at: string;
};

export type PromoCodeCampaignWithCount = PromoCodeCampaign & {
  promo_code_count: number;
};

export type PromoCodeCampaignMap = {
  id: string;
  campaign_id: string;
  promo_code_id: string;
  promo_code_name: string;
  created_by: string | null;
  created_at: string;
};

export type CampaignListResult = {
  items: PromoCodeCampaignWithCount[];
  pagination: {
    page: number;
    pageSize: number;
    total: number;
    totalPages: number;
  };
};

export type CampaignAnalytics = {
  byPromoCode: Array<{
    promo_code_id: string;
    signups: number;
    logged_in: number;
    internal_bookings?: number;
    external_bookings?: number;
  }>;
  byPromoCodeArea: Array<{
    promo_code_id: string;
    area: string;
    signups: number;
  }>;
  byCountryPromoCode: Array<{
    country: string;
    promo_code_id: string;
    signups: number;
  }>;
  byDay?: Array<{ day: string; signups: number }>;
  total: number;
  totalLoggedIn?: number;
  totalInternalBookings?: number;
  totalExternalBookings?: number;
};

export type CampaignAnalyticsResponse = {
  promo_codes: PromoCodeCampaignMap[];
  analytics: CampaignAnalytics;
};

export type PromoCodeUserRow = {
  member_number?: string;
  membership_number?: string;
  // The code the member signed up with (members.signup_promo_code). Carried per
  // row so a multi-code report can show which code each member belongs to.
  signup_promo_code?: string;
  account_type_name?: string;
  account_status_name?: string;
  email?: string;
  first_name?: string;
  last_name?: string;
  country?: string;
  // member_profiles.mobile / nationality / date_of_birth.
  phone?: string | null;
  nationality?: string | null;
  date_of_birth?: string | null;
  commence_date?: string | null;
  // Updot members.first_access_attempt — TRUE once a member has logged in.
  first_access_attempt?: boolean | string | null;
  internal_bookings_count?: number;
  external_bookings_count?: number;
  [key: string]: unknown;
};

export type PromoCodeUsersResult = {
  items: PromoCodeUserRow[];
  pagination: {
    page: number;
    pageSize: number;
    total: number;
    totalPages: number;
  };
};

export type DashboardOverviewRow = {
  id: string;
  name: string;
  promo_code_count: number;
};
