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
  flexibility: number
  visibility: number
  footfall: number
  talentAccess: number
  esg: 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 NotificationConfig {
  enabled: boolean
  minScore: number       // 0–100, default 80
  emailAddress?: 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

  // Structured requirement flags
  requireGroundFloor?: boolean
  requiredFitOut?: 'BASIC' | 'FULL' | 'PREMIUM'
  requiredParkingMin?: number
  requireAirConditioning?: boolean
  requireLoadingDock?: boolean
  requireBarrierFree?: boolean
  minCeilingHeightM?: number
  minContractDurationMonths?: number
  searchRadius?: number
  isAnonymous?: boolean
  requiresDivisibility?: boolean
  minDivisibleUnit?: number
  fitOutBudgetMaxPerSqm?: number

  softFactors?: SoftFactorPreferences
  weightingProfile: WeightingProfile
  confidenceInCriteria: number
  extractedFromText?: string
  notes?: string
  notificationConfig?: NotificationConfig
  organizationId?: string
  createdAt: string
  updatedAt: string
}

export type CreateNeedInput = Omit<Need, 'id' | 'createdAt' | 'updatedAt'>
export type UpdateNeedInput = Partial<CreateNeedInput>
