import type { PostgresJsDatabase } from "drizzle-orm/postgres-js"; import type { z } from "zod"; import { type Booking, type BookingTraveler } from "./schema-core.js"; import { type BookingGroup, type BookingGroupMember } from "./schema-groups.js"; import type { addBookingGroupMemberSchema, bookingGroupListQuerySchema, insertBookingGroupSchema, updateBookingGroupSchema } from "./validation.js"; export type BookingGroupListQuery = z.infer; export type CreateBookingGroupInput = z.infer; export type UpdateBookingGroupInput = z.infer; export type AddBookingGroupMemberInput = z.infer; export type BookingGroupMemberWithBooking = BookingGroupMember & { booking: Booking | null; }; export declare function listBookingGroups(db: PostgresJsDatabase, query: BookingGroupListQuery): Promise<{ data: BookingGroup[]; total: number; limit: number; offset: number; }>; export declare function getBookingGroupById(db: PostgresJsDatabase, id: string): Promise; export declare function createBookingGroup(db: PostgresJsDatabase, data: CreateBookingGroupInput): Promise; export declare function updateBookingGroup(db: PostgresJsDatabase, id: string, data: UpdateBookingGroupInput): Promise; export declare function deleteBookingGroup(db: PostgresJsDatabase, id: string): Promise<{ id: string; } | null>; export declare function listGroupMembers(db: PostgresJsDatabase, groupId: string): Promise; export declare function getBookingGroupForBooking(db: PostgresJsDatabase, bookingId: string): Promise<(BookingGroup & { membership: BookingGroupMember; }) | null>; export declare function addGroupMember(db: PostgresJsDatabase, groupId: string, data: AddBookingGroupMemberInput): Promise<{ status: "ok"; member: BookingGroupMember; } | { status: "group_not_found"; } | { status: "booking_not_found"; } | { status: "already_in_group"; currentGroupId: string; }>; export declare function removeGroupMember(db: PostgresJsDatabase, groupId: string, bookingId: string): Promise<{ id: string; } | null>; /** * Dissolve or slim down a booking group after a member is cancelled. * * - 3+ active members remain: no-op (group stays intact) * - 1 active member remains: dissolve (delete last member + group) * - 0 active members remain: delete the group */ export declare function cleanupGroupOnBookingCancelled(db: PostgresJsDatabase, bookingId: string): Promise; export declare function listGroupBookingTravelers(db: PostgresJsDatabase, groupId: string): Promise; export declare const bookingGroupsService: { listBookingGroups: typeof listBookingGroups; getBookingGroupById: typeof getBookingGroupById; createBookingGroup: typeof createBookingGroup; updateBookingGroup: typeof updateBookingGroup; deleteBookingGroup: typeof deleteBookingGroup; listGroupMembers: typeof listGroupMembers; getBookingGroupForBooking: typeof getBookingGroupForBooking; addGroupMember: typeof addGroupMember; removeGroupMember: typeof removeGroupMember; cleanupGroupOnBookingCancelled: typeof cleanupGroupOnBookingCancelled; listGroupBookingTravelers: typeof listGroupBookingTravelers; };