import type { FarmAccessRequest, FarmAccessRequestStatus, FarmMember } from './types' type TimestampLike = Date | { toMillis: () => number } export function buildFarmMemberId(farmId: string, userId: string) { return `${farmId}_${userId}` } export function buildFarmAccessRequestId(farmId: string, userId: string) { return `${farmId}_${userId}` } export function timestampToMillis(value: TimestampLike) { return value instanceof Date ? value.getTime() : value.toMillis() } export function deriveAccessRequestStatus( status: FarmAccessRequestStatus, requestExpiresAt: TimestampLike, nowMs = Date.now() ): FarmAccessRequestStatus { if (status !== 'pending') return status return timestampToMillis(requestExpiresAt) < nowMs ? 'expired' : 'pending' } export function withDisplayAccessRequestStatus(request: FarmAccessRequest, nowMs = Date.now()): FarmAccessRequest { return { ...request, status: deriveAccessRequestStatus(request.status, request.requestExpiresAt as TimestampLike, nowMs), } } export function canLeaveFarm(userId: string, membership: Pick) { return membership.userId === userId && membership.role !== 'owner' } export function canResolveAccessRequest(ownerId: string, request: Pick) { return request.ownerId === ownerId && request.status === 'pending' } export function hasDuplicatePendingRequest( requests: Array>, farmId: string, requesterId: string ) { return requests.some((request) => request.farmId === farmId && request.requesterId === requesterId && request.status === 'pending' ) }