import type { CurrencyCode, SupportedLocale } from '@household/domain' import type { ReminderTarget } from './reminders' export const HOUSEHOLD_TOPIC_ROLES = ['purchase', 'feedback', 'reminders', 'payments'] as const export const HOUSEHOLD_MEMBER_LIFECYCLE_STATUSES = ['active', 'away', 'left'] as const export const HOUSEHOLD_MEMBER_ABSENCE_POLICIES = [ 'resident', 'away_rent_and_utilities', 'away_rent_only', 'inactive' ] as const export const HOUSEHOLD_PAYMENT_BALANCE_ADJUSTMENT_POLICIES = [ 'utilities', 'rent', 'separate' ] as const export type HouseholdTopicRole = (typeof HOUSEHOLD_TOPIC_ROLES)[number] export type HouseholdMemberLifecycleStatus = (typeof HOUSEHOLD_MEMBER_LIFECYCLE_STATUSES)[number] export type HouseholdMemberAbsencePolicy = (typeof HOUSEHOLD_MEMBER_ABSENCE_POLICIES)[number] export type HouseholdPaymentBalanceAdjustmentPolicy = (typeof HOUSEHOLD_PAYMENT_BALANCE_ADJUSTMENT_POLICIES)[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 status: HouseholdMemberLifecycleStatus preferredLocale: SupportedLocale | null householdDefaultLocale: SupportedLocale rentShareWeight: number isAdmin: boolean } export interface HouseholdMemberAbsencePolicyRecord { householdId: string memberId: string effectiveFromPeriod: string policy: HouseholdMemberAbsencePolicy } export interface HouseholdBillingSettingsRecord { householdId: string settlementCurrency: CurrencyCode paymentBalanceAdjustmentPolicy?: HouseholdPaymentBalanceAdjustmentPolicy 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 status?: HouseholdMemberLifecycleStatus 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 paymentBalanceAdjustmentPolicy?: HouseholdPaymentBalanceAdjustmentPolicy 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 updateHouseholdMemberStatus( householdId: string, memberId: string, status: HouseholdMemberLifecycleStatus ): Promise listHouseholdMemberAbsencePolicies( householdId: string ): Promise upsertHouseholdMemberAbsencePolicy(input: { householdId: string memberId: string effectiveFromPeriod: string policy: HouseholdMemberAbsencePolicy }): Promise }