types/kv/event-catalog.ts

/**
 * Event Catalog KV Models
 */

export interface NearbyEventEntry {
  events: Event[];
  featured_events: Event[];
  favorite_performer?: Performer; // added by workers
}

export interface EventCatalogEntry {
  event_data?: Event;
  inventory_trends?: Record<InventoryTrendType, InventoryTrend[]>;
  tracked_count?: number;
  untracked_count?: number;
  probabilities?: Record<EventProbabilityType, EventProbabilityValue>;
}

export const INVENTORY_TREND_TYPES = {
  MIN_PRICE: "min_price",
  AVE_PRICE: "ave_price",
  QTY: "qty",
} as const;

export type InventoryTrendType =
  (typeof INVENTORY_TREND_TYPES)[keyof typeof INVENTORY_TREND_TYPES];

export interface InventoryTrend {
  from_date: string;
  to_date: string;
  from_value: number;
  to_value: number;
  pct_diff: number;
}

export interface TrendData {
  from: number;
  to: number;
  pct_diff: number;
}

export const EVENT_PROBABILITY_TYPES = {
  PRICE_INCREASE: "price_increase",
} as const;

export type EventProbabilityType =
  (typeof EVENT_PROBABILITY_TYPES)[keyof typeof EVENT_PROBABILITY_TYPES];

export interface EventProbabilityValue {
  value: number;
  updated_at: string;
  model_version?: string;
}

export interface EventInventoryTrend {
  min_price?: Record<number, TrendData>;
  ave_price?: Record<number, TrendData>;
  qty?: Record<number, TrendData>;
}

export interface Event {
  event_id: string;
  display_name: string;
  description: string;
  event_date?: string | null;
  event_date_utc?: string | null;
  city: string;
  state: string;
  image_url: string;
  event_name: string;
  event_type: string;
  child_category: string;
  grandchild_category: string;
  main_performer: Performer;
  secondary_performers: Performer[];
  venue: Venue;
  buy_url: string;
  status: "Scheduled" | "Rescheduled" | "Postponed" | "Canceled";
  original_event_date: string;
  short_name: string;
  share_link: string;
  tags?: { type: string; precedence?: number }[];
  is_favorited?: boolean; // added by workers
}

export interface Performer {
  performer_id: string;
  name: string;
  url: string;
  sell_url: string;
  img_url: string;
  home_venue?: number;
  slug: string;
  short_name: string;
  share_link: string;
  primary_color: string;
  secondary_color: string;
  has_image?: boolean;
  role?: string;
}

export interface Venue {
  id?: number;
  name: string;
  address: string;
  city: string;
  state: string;
  zipcode: string;
  country: string;
  description: string;
  img_url: string;
  url: string;
  latitude?: number;
  longitude?: number;
  timezone: string;
}