import type { CurrencyCode, SupportedLocale } from '@household/domain' import type { ReminderTarget } from './reminders' export const HOUSEHOLD_TOPIC_ROLES = ['purchase', 'feedback', 'reminders', 'payments'] as const export type HouseholdTopicRole = (typeof HOUSEHOLD_TOPIC_ROLES)[number] export interface HouseholdTelegramChatRecord { householdId: string householdName: string telegramChatId: string telegramChatType: string title: string | null defaultLocale: SupportedLocale } export interface HouseholdTopicBindingRecord { householdId: string role: HouseholdTopicRole telegramThreadId: string topicName: string | null } export interface HouseholdJoinTokenRecord { householdId: string householdName: string token: string createdByTelegramUserId: string | null } export interface HouseholdPendingMemberRecord { householdId: string householdName: string telegramUserId: string displayName: string username: string | null languageCode: string | null householdDefaultLocale: SupportedLocale } export interface HouseholdMemberRecord { id: string householdId: string telegramUserId: string displayName: string preferredLocale: SupportedLocale | null householdDefaultLocale: SupportedLocale rentShareWeight: number isAdmin: boolean } export interface HouseholdBillingSettingsRecord { householdId: string settlementCurrency: CurrencyCode rentAmountMinor: bigint | null rentCurrency: CurrencyCode rentDueDay: number rentWarningDay: number utilitiesDueDay: number utilitiesReminderDay: number timezone: string } export interface HouseholdUtilityCategoryRecord { id: string householdId: string slug: string name: string sortOrder: number isActive: boolean } export interface RegisterTelegramHouseholdChatInput { householdName: string telegramChatId: string telegramChatType: string title?: string } export interface RegisterTelegramHouseholdChatResult { status: 'created' | 'existing' household: HouseholdTelegramChatRecord } export interface HouseholdConfigurationRepository { registerTelegramHouseholdChat( input: RegisterTelegramHouseholdChatInput ): Promise getTelegramHouseholdChat(telegramChatId: string): Promise getHouseholdChatByHouseholdId(householdId: string): Promise bindHouseholdTopic(input: { householdId: string role: HouseholdTopicRole telegramThreadId: string topicName?: string }): Promise getHouseholdTopicBinding( householdId: string, role: HouseholdTopicRole ): Promise findHouseholdTopicByTelegramContext(input: { telegramChatId: string telegramThreadId: string }): Promise listHouseholdTopicBindings(householdId: string): Promise clearHouseholdTopicBindings(householdId: string): Promise listReminderTargets(): Promise upsertHouseholdJoinToken(input: { householdId: string token: string createdByTelegramUserId?: string }): Promise getHouseholdJoinToken(householdId: string): Promise getHouseholdByJoinToken(token: string): Promise upsertPendingHouseholdMember(input: { householdId: string telegramUserId: string displayName: string username?: string languageCode?: string }): Promise getPendingHouseholdMember( householdId: string, telegramUserId: string ): Promise findPendingHouseholdMemberByTelegramUserId( telegramUserId: string ): Promise ensureHouseholdMember(input: { householdId: string telegramUserId: string displayName: string preferredLocale?: SupportedLocale | null rentShareWeight?: number isAdmin?: boolean }): Promise getHouseholdMember( householdId: string, telegramUserId: string ): Promise listHouseholdMembers(householdId: string): Promise getHouseholdBillingSettings(householdId: string): Promise updateHouseholdBillingSettings(input: { householdId: string settlementCurrency?: CurrencyCode rentAmountMinor?: bigint | null rentCurrency?: CurrencyCode rentDueDay?: number rentWarningDay?: number utilitiesDueDay?: number utilitiesReminderDay?: number timezone?: string }): Promise listHouseholdUtilityCategories( householdId: string ): Promise upsertHouseholdUtilityCategory(input: { householdId: string slug?: string name: string sortOrder: number isActive: boolean }): Promise listHouseholdMembersByTelegramUserId( telegramUserId: string ): Promise listPendingHouseholdMembers(householdId: string): Promise approvePendingHouseholdMember(input: { householdId: string telegramUserId: string isAdmin?: boolean }): Promise updateHouseholdDefaultLocale( householdId: string, locale: SupportedLocale ): Promise updateMemberPreferredLocale( householdId: string, telegramUserId: string, locale: SupportedLocale ): Promise promoteHouseholdAdmin( householdId: string, memberId: string ): Promise updateHouseholdMemberRentShareWeight( householdId: string, memberId: string, rentShareWeight: number ): Promise }