import type { PisellReservationTableRow } from '../types';
import type { FloorRoomCardBooking, FloorRoomCardData } from './floorRoomCardModel';
/**
 * 图元多段联系人之间的间隔（中点两侧为 nbsp）。
 * 普通空格在部分 inline-flex / flex 排版下会与相邻文本折叠，看起来像「了点没空格」。
 */
export declare const FLOOR_ROOM_CARD_GUEST_SEGMENT_SEP = "\u00A0\u00B7\u00A0";
/** 统一的起止毫秒（供资源墙/卡片兼容层复用，避免重复推断） */
export declare function floorRoomCardBookingStartEndMs(booking: Pick<FloorRoomCardBooking, 'start_date' | 'start_time' | 'end_date' | 'end_time'>): {
    start: number;
    end: number;
};
/** 日程时刻按展示「整分」对齐（该分钟 00.000） */
export declare function reservationScheduleMinuteFloorMs(ms: number): number;
/**
 * 大屏等资源墙：写在日程上的「结束」表示该分钟整段结束前不算 overtime；
 * expired 从「结束时刻所在分钟的下一分钟」整点开始。
 * 例：结束 9:00 → 9:00:00～9:00:59 仍 non-expired，9:01:00 起 expired。
 */
export declare function reservationScheduleOccupiedOvertimeThresholdMs(endMs: number): number;
/**
 * 大屏等资源墙：未到「开始分钟」的下一分钟整点不算迟到（与结束侧对称）。
 * 例：开始 8:00 → 8:00:00～8:00:59 仍 boardingSoon，8:01:00 起 late。
 */
export declare function reservationScheduleReservedLateThresholdMs(startMs: number): number;
/**
 * 预留态时间行：图元内仅展示时刻 + 文案后缀，不展示开始日期。
 */
export declare function formatFloorRoomCardBookingStartLine(booking: Pick<FloorRoomCardBooking, 'start_date' | 'start_time'>, endSuffix: string): string;
/**
 * 占用态时间行：图元内仅展示结束时刻 + 后缀，不展示结束日期。
 */
export declare function formatFloorRoomCardBookingEndLine(booking: Pick<FloorRoomCardBooking, 'end_date' | 'end_time'>, endSuffix: string): string;
/**
 * 「下一条」等时段：图元内只写起止时刻，不写日期。
 */
export declare function formatFloorRoomCardBookingTimeRange(booking: Pick<FloorRoomCardBooking, 'start_date' | 'start_time' | 'end_date' | 'end_time'>): string;
/** 预约时段内进度 0–100（与 demo getProgressPercent 一致，使用真实时间） */
export declare function getFloorRoomCardProgressPercent(startDate: string, startTime: string, endDate: string, endTime: string, nowMs?: number): number;
/**
 * 进度条百分比：优先宿主 `progressPercent`（0–100），否则按起止时间与当前时刻推算。
 */
export declare function resolveFloorRoomCardProgressPercent(booking: Pick<FloorRoomCardBooking, 'start_date' | 'start_time' | 'end_date' | 'end_time' | 'progressPercent'>, nowMs?: number): number;
/** 将分钟数格式化为「10m」「1h 5m」等（图元迟到/超时展示） */
export declare function formatFloorRoomCardDurationMinutes(totalMin: number): string;
/** 已超过结束时刻的加时时长文案 */
export declare function getFloorRoomCardOvertime(endDate: string, endTime: string, nowMs?: number): string | null;
/** 已逾开始时刻的「迟到」时长 */
export declare function getFloorRoomCardLateTime(startDate: string, startTime: string, nowMs?: number): string | null;
/** 距开始时刻的倒计时分钟（不含文案前缀）；仅本地起止时间推算 */
export declare function getFloorRoomCardArrivalMinutes(room: FloorRoomCardData, nowMs?: number): number | null;
/**
 * 预留态「还有 n 分钟」：优先宿主 `remainingReserveTime`（分钟，>0），否则 {@link getFloorRoomCardArrivalMinutes}
 */
export declare function resolveFloorRoomCardReservedCountdownMinutes(room: FloorRoomCardData, nowMs?: number): number | null;
/**
 * 多预约列表中单条：与 {@link resolveFloorRoomCardReservedCountdownMinutes} 一致，但针对当前行 booking。
 */
export declare function resolveFloorRoomCardReservedCountdownMinutesForBooking(booking: FloorRoomCardBooking, nowMs?: number): number | null;
/**
 * 紧凑多预约行：仅当该条 booking 有宿主 `lateTime`（分钟）时为 late，否则 not_arrived（不按本地时刻推算迟到）。
 */
export declare function getFloorRoomCardReservedRowBodyType(booking: FloorRoomCardBooking, _nowMs?: number): 'not_arrived' | 'late';
declare type BookingTimeFields = Pick<FloorRoomCardBooking, 'start_date' | 'start_time' | 'end_date' | 'end_time'>;
/** 当前时刻是否落在预约时段内 [start, end)（进行中） */
export declare function isFloorRoomCardBookingInProgress(booking: BookingTimeFields, nowMs?: number): boolean;
/** 当前时刻是否在预约开始之前（未开始） */
export declare function isFloorRoomCardBookingNotStarted(booking: BookingTimeFields, nowMs?: number): boolean;
/**
 * 第一条预约进行中且其后仍有未开始的时段：返回第一条「未开始」预约，用于 Next 行。
 * 不依赖 cardType（不必 late/timeout）。
 */
export declare function getFloorRoomCardNextNotStartedBooking(data: FloorRoomCardData, nowMs?: number): FloorRoomCardBooking | null;
/**
 * 多条预约里恰好一条 `hostBookingStatus === 'occupied'` 时：把该条排到首位，便于标准占用卡用 bookings[0] 展示。
 * 多条同时为 occupied 或未标记 host 时不改顺序。
 */
export declare function reorderBookingsForSingleOccupiedPrimary(list: FloorRoomCardBooking[]): FloorRoomCardBooking[];
/**
 * 多条预约且仅一条为 occupied：按开始时间排序后，取占用段之后的下一条（用于 Next 行）。
 */
export declare function getFloorRoomCardNextAfterSingleOccupiedBooking(data: FloorRoomCardData): FloorRoomCardBooking | null;
/**
 * 多条均为预留（无 occupied）：`bookings` 已按开始时间排好，主卡为 [0]，Next 为紧邻的下一条。
 */
export declare function getFloorRoomCardNextAfterPrimaryReserved(data: FloorRoomCardData): FloorRoomCardBooking | null;
/**
 * 接口标记 `isNext` 的预约：按开始时间取第一条，供 Next 行展示。
 */
export declare function getFloorRoomCardExplicitNextBooking(data: FloorRoomCardData): FloorRoomCardBooking | null;
/**
 * 与 {@link buildCardBodyViewModel} Next 行同一套优先级：接口 `is_next`/`isNext` →
 * 单 occupied 后一条 → 多条 reserved 第二条 →「进行中」后首条未开始。
 */
export declare function resolveFloorRoomCardNextBookingLikeBodyModel(data: FloorRoomCardData, nowMs?: number): FloorRoomCardBooking | null;
/** Next 条客人一行：与图元同源，多层联系人用 ` · ` 拼接 */
export declare function formatFloorRoomCardNextGuestStripLine(b: FloorRoomCardBooking): string;
/** 单层 holder：姓名优先；预留态可手机号尾号脱敏 */
export declare function formatFloorRoomCardGuestDisplayLineFromHolder(holder: FloorRoomCardBooking['holder'], showPhone: boolean): string;
/**
 * 图元联系人：按 holder → contacts_info → customer 各层格式化后合并；
 * 无 {@link FloorRoomCardBooking.contactTiers} 时退化为单层 {@link FloorRoomCardBooking.holder}。
 */
export declare function floorRoomCardGuestSegments(booking: FloorRoomCardBooking, showPhone: boolean): string[];
/**
 * 联系人展示字符串（单层或多层 ` · `）；与平面图 / 资源墙单行摘要一致。
 */
export declare function formatFloorRoomCardGuestDisplayLine(booking: FloorRoomCardBooking, showPhone: boolean): string;
/**
 * 主区域展示用：第一条非 `isNext`；若全部为 next 则回退首条。
 */
export declare function getFloorRoomCardPrimaryBooking(data: FloorRoomCardData): FloorRoomCardBooking | undefined;
/**
 * 多条预约且均为预留态（host 为 reserved 或未标）：按开始时间排序，主卡只展示最近一档，其余走 Next。
 */
export declare function reorderBookingsAllReservedChronological(list: FloorRoomCardBooking[]): FloorRoomCardBooking[];
/** 与 demo getCardType 一致 */
export declare function getFloorRoomCardType(room: FloorRoomCardData): 'empty' | 'locked' | 'multi_occupied' | 'multi_reserved' | 'not_arrived' | 'late' | 'payed' | 'payment_required' | 'timeout';
/**
 * 平面图 RoomCard 联系人手机号展示：与 {@link ReservationFloorRoomCard} ContactInfo 一致。
 */
export declare function maskPisellReservationPhoneTail(phone: string): string | null;
/**
 * 房间标题：优先数据行 `main_field` 展示名（` ## ` 前为主名称），其次 `code`，最后图元编辑名。
 * 与平面图 `reservationCards` 绑定桌位卡一致。
 */
export declare function displayRoomTitleFromRow(row: PisellReservationTableRow, sceneElementName: string | undefined): string;
/**
 * 展示用名称：`main_field` 按 ` ## ` 分段且有两段及以上时取**第二段**（常见「内部码 ## 展示名」），
 * 否则取第一段；再无则回退 {@link displayRoomTitleFromRow}。
 */
export declare function displayRoomShowNameFromRow(row: PisellReservationTableRow, sceneElementName: string | undefined): string;
export {};
