import type { ResultType } from '../../domain/enums' import type { TradeOff, Risk, MissingDataItem } from '../../domain/match' export type MatchCardVariant = 'compact' | 'expanded' | 'review' | 'compare-mini' export type MatchCardActionType = | 'OPEN_DETAIL' | 'ADD_COMPARE' | 'SAVE_SHORTLIST' | 'SEND_REVIEW' | 'APPROVE' | 'REJECT' | 'REQUEST_DATA' export interface MatchCardAction { id: string label: string actionType: MatchCardActionType variant?: 'primary' | 'secondary' | 'danger' disabled?: boolean onClick: () => void } export interface MatchCardReason { type: 'HARD_FACT' | 'SOFT_FACTOR' | 'STRATEGIC' label: string explanation: string score: number } export interface MatchCardViewModel { id: string title: string resultType: ResultType assetType?: string matchScore: number confidenceScore: number // 0–1 dataQualityScore: number // 0–1 locationLabel: string availabilityLabel?: string sourceLabel?: string externalUrl?: string reasons: MatchCardReason[] // max 3: HARD_FACT, SOFT_FACTOR, STRATEGIC tradeoffs: TradeOff[] risks: Risk[] missingData: MissingDataItem[] actions: MatchCardAction[] disclaimer?: string // required for FUTURE_AVAILABILITY explainabilitySummary?: string taxCalculatorUrl?: string // deeplink to cantonal tax calculator // Schattenmarkt / FUTURE_AVAILABILITY signal fields signalSourceType?: 'PRESS' | 'CONSTRUCTION_PERMIT' | 'JOB_POSTING' | 'COMPANY_REPORT' | 'MARKET_DATA' | 'MANUAL' signalSourceUrl?: string signalSourceCredibility?: 'LOW' | 'MEDIUM' | 'HIGH' signalProbability?: number signalMarketIndicator?: string signalType?: string signalIsVerified?: boolean aiSignalSummary?: string // States isSelected?: boolean isCompareSelected?: boolean isRestricted?: boolean isReviewRequired?: boolean isStaleData?: boolean }