import type {
  AssetType, ResultType, AvailabilityStatus, AvailabilityType,
  FreshnessStatus, RiskLevel, SourceType, DataQualityLevel,
} from './enums'

// ── Location / Address ────────────────────────────────────────────────────────

export interface Location {
  city: string
  district?: string
  canton?: string
  region?: string
  country: string
  coordinates?: { lat: number; lng: number }
}

export interface Address {
  street: string
  houseNumber: string
  postalCode: string
  city: string
  country: string
}

// ── Source Metadata ───────────────────────────────────────────────────────────

export interface SourceMeta {
  sourceType: SourceType | string
  sourceLabel?: string
  sourceUrl?: string
  sourceUpdatedAt?: string
  externalId?: string
}

// ── Data Quality ──────────────────────────────────────────────────────────────

export interface DataQuality {
  score: number
  qualityLevel?: DataQualityLevel
  missingCriticalFields: string[]
  missingOptionalFields: string[]
  lastVerifiedAt?: string
  freshness: FreshnessStatus
  warnings: string[]
}

// ── Hard Facts ────────────────────────────────────────────────────────────────

export interface PropertyHardFacts {
  floor?: number
  fitOut?: 'SHELL' | 'BASIC' | 'FULL' | 'PREMIUM'
  parking?: number
  publicTransportScore?: number
  usageType?: string
  ceilingHeightM?: number
  loadingDocksCount?: number
  powerSupplyKva?: number
  hasServerRoom?: boolean
  isBarrierFree?: boolean
}

// ── Soft Factors ──────────────────────────────────────────────────────────────

export interface SoftFactors {
  prestigeScore?: number
  visibilityScore?: number
  footfallScore?: number
  commuterAccessScore?: number
  talentAccessScore?: number
  esgScore?: number
  flexibilityScore?: number
  expansionPotentialScore?: number
  taxEnvironmentScore?: number
  // Legacy aliases kept for mock-data backward compatibility
  prestige?: number
  accessibility?: number
  talentAccess?: number
  esgRating?: string
  passerbyFrequency?: 'LOW' | 'MEDIUM' | 'HIGH' | 'VERY_HIGH'
  parkingSpots?: number
  publicTransportMinutes?: number
  infrastructureNotes?: string
}

// ── Property ──────────────────────────────────────────────────────────────────

export interface Property {
  id: string
  organizationId?: string
  title: string

  assetType: AssetType
  resultType: ResultType

  location: Location
  address: Address

  areaSqm: number
  areaSqmMin?: number
  areaSqmMax?: number

  rentPricePerSqm: number
  rentChfSqmYear?: number
  totalRentMonthly?: number
  ancillaryCosts?: number

  availabilityDate: string
  availabilityStatus: AvailabilityStatus
  availabilityType?: AvailabilityType

  sourceType: string
  sourceLabel?: string
  sourceUrl?: string
  sourceUpdatedAt?: string
  sourceMeta?: SourceMeta

  confidenceScore: number
  dataQuality: DataQuality

  softFactors?: SoftFactors
  hardFacts?: PropertyHardFacts

  // Legacy fields — kept for backward compat
  floorLevel?: number
  expansionPotentialSqm?: number

  contractDurationMonths?: number
  riskLevel?: RiskLevel
  description?: string
  images?: string[]

  status?: 'ACTIVE' | 'INACTIVE' | 'DRAFT' | 'ARCHIVED'
  lastReviewedAt?: string
  createdAt: string
  updatedAt: string
}

export type CreatePropertyInput = Omit<Property, 'id' | 'createdAt' | 'updatedAt'>
export type UpdatePropertyInput = Partial<CreatePropertyInput>
