import type { AssetType, MatchStatus } from './enums' export interface AreaRange { min: number max: number } export interface BudgetRange { minPerSqm?: number maxPerSqm: number maxMonthlyTotal?: number currency: string } export interface Timing { earliestMoveIn: string latestMoveIn: string contractDurationMonths?: number flexibleTiming: boolean } export interface WeightingProfile { area: number location: number budget: number timing: number prestige: number accessibility: number expansionPotential: number taxEnvironment: number [key: string]: number } export interface SoftFactorPreferences { minPrestige?: number minAccessibility?: number requireParking?: boolean maxPublicTransportMinutes?: number preferredEsgRating?: string requireHighVisibility?: boolean } export interface SizeRange { minSqm: number maxSqm: number } export interface MustHaveCriterion { criterion: string description?: string weight?: number // 0–1, how much a miss hurts the score } export interface WeightedPreference { criterion: string weight: number // 0–1 idealValue?: string | number description?: string } export interface Need { id: string companyName: string contactName?: string assetType: AssetType requiredArea: AreaRange // F004 additions desiredLocation?: string[] // preferred city/district list sizeRange?: SizeRange // structured alias for requiredArea mustHaveCriteria?: MustHaveCriterion[] weightedPreferences?: WeightedPreference[] status?: MatchStatus | 'ACTIVE' | 'INACTIVE' | 'DRAFT' | 'CLOSED' preferredLocations: string[] excludedLocations?: string[] budgetRange: BudgetRange timing: Timing mustCriteriaText?: string[] // legacy — prefer mustHaveCriteria softFactors?: SoftFactorPreferences weightingProfile: WeightingProfile confidenceInCriteria: number extractedFromText?: string notes?: string organizationId?: string createdAt: string updatedAt: string } export type CreateNeedInput = Omit export type UpdateNeedInput = Partial