/** Volvo Fleet API–aligned field shapes (mock). */

export type VehicleGroup =
  | "bestand"
  | "vorfuehr"
  | "ersatz_miet"
  | "pool";

export type SiteId = "muc-nord" | "muc-sued";

export type ZoneId =
  | "verkauf"
  | "werkstatt"
  | "hof"
  | "auslieferung";

export interface GeoPoint {
  latitude: number;
  longitude: number;
  altitude?: number;
}

export interface Zone {
  id: ZoneId;
  name: string;
  siteId: SiteId;
  polygon: [number, number][]; // [lat, lng]
}

export interface Site {
  id: SiteId;
  name: string;
  shortName: string;
  center: GeoPoint;
  zones: Zone[];
}

export interface Eligibility {
  region: string;
  hasTelematics: boolean;
  supportsDriverBehaviorData: boolean;
  supportsRealtimeLocation: boolean;
  configurableRtlFrequency: boolean;
}

export interface InventoryVehicle {
  vin: string;
  market: string;
  active: boolean;
  updatedAt: string;
}

export interface CarInformation {
  fuelTankCapacity: number | null;
  driveBatteryCapacity: number | null;
  currentCarSoftwareVersion: string;
  latestAvailableCarSoftwareVersion: string;
}

export interface Odometer {
  timestamp: string;
  odometerMeters: number;
  tripMeterManualKm: number;
  tripMeterAutomaticKm: number;
  averageSpeedKmPerHour: number;
}

export interface Fuel {
  timestamp: string;
  distanceToEmptyKm: number;
  distanceToEmptyMiles: number;
  averageFuelConsumptionLitersPer100Km: number;
  averageFuelConsumptionLitersPer100KmManual: number;
  fuelAmountLiters: number;
  fuelLeftPercentage: number;
}

export type WarningLevel = "NO_WARNING" | "WARNING" | "CRITICAL";

export interface Health {
  timestamp: string;
  engineHoursToService: number;
  daysToService: number;
  distanceToServiceKm: number;
  serviceWarning: WarningLevel;
  brakeFluidLevelWarning: WarningLevel;
  engineCoolantLevelWarning: WarningLevel;
  oilLevelWarning: WarningLevel;
  frontLeftTyrePressureWarning: WarningLevel;
  frontRightTyrePressureWarning: WarningLevel;
  rearLeftTyrePressureWarning: WarningLevel;
  rearRightTyrePressureWarning: WarningLevel;
  lowVoltageBatteryWarning: WarningLevel;
}

export type ChargerConnectionStatus =
  | "DISCONNECTED"
  | "CONNECTED"
  | "FAULT";

export type ChargingStatus =
  | "IDLE"
  | "CHARGING"
  | "DONE"
  | "ERROR"
  | "SCHEDULED";

export interface Battery {
  timestamp: string;
  batteryChargeLevelPercentage: number;
  averageEnergyConsumptionKwhPer100Km: number;
  averageEnergyConsumptionKwhPer100KmManual: number;
  estimatedDistanceToEmptyKm: number;
  estimatedDistanceToEmptyMiles: number;
  estimatedChargingTimeToFullMinutes: number;
  chargerConnectionStatus: ChargerConnectionStatus;
  chargingStatus: ChargingStatus;
}

export type OpenClosed = "OPEN" | "CLOSED" | "UNKNOWN";
export type LockState = "LOCKED" | "UNLOCKED" | "UNKNOWN";

export interface Exterior {
  timestamp: string;
  centralLock: LockState;
  frontLeftDoor: OpenClosed;
  frontRightDoor: OpenClosed;
  rearLeftDoor: OpenClosed;
  rearRightDoor: OpenClosed;
  frontLeftWindow: OpenClosed;
  frontRightWindow: OpenClosed;
  rearLeftWindow: OpenClosed;
  rearRightWindow: OpenClosed;
  hood: OpenClosed;
  tailgate: OpenClosed;
  tankLid: OpenClosed;
  sunroof: OpenClosed;
}

export type AvailabilityStatus = "AVAILABLE" | "UNAVAILABLE";
export type UsageMode =
  | "IDLE"
  | "DRIVING"
  | "CHARGING"
  | "SERVICE"
  | "UNKNOWN";

export interface Availability {
  timestamp: string;
  availabilityStatus: AvailabilityStatus;
  unavailableReason: string | null;
  usageMode: UsageMode;
}

export interface Location {
  type: "Feature";
  geometry: {
    type: "Point";
    coordinates: [number, number, number?]; // lon, lat, alt
  };
  properties: {
    heading: number;
    timestamp: string;
  };
}

export interface ParkingClimatization {
  timestamp: string;
  runningStatus: "OFF" | "RUNNING" | "ERROR";
  runtimeLeftMinutes: number;
  errors: string[];
}

export type Powertrain = "BEV" | "PHEV" | "ICE";

export interface VehicleMaster {
  vin: string;
  licensePlate: string;
  model: string;
  modelYear: number;
  color: string;
  powertrain: Powertrain;
  group: VehicleGroup;
  /** Expected home site / zone for evening checks */
  expectedSiteId: SiteId;
  expectedZoneId: ZoneId;
  inventory: InventoryVehicle;
  eligibility: Eligibility;
  carInformation: CarInformation;
  odometer: Odometer;
  fuel: Fuel | null;
  battery: Battery | null;
  health: Health;
  exterior: Exterior;
  availability: Availability;
  location: Location;
  parkingClimatization: ParkingClimatization;
}

export interface FleetSnapshot {
  fleetInventoryId: string;
  fleetName: string;
  sites: Site[];
  vehicles: VehicleMaster[];
  generatedAt: string;
}

export type ReadinessIssueCode =
  | "LOW_ENERGY"
  | "EXTERIOR_OPEN"
  | "HEALTH_WARNING"
  | "STALE_DATA"
  | "SOFTWARE_OUTDATED"
  | "UNAVAILABLE"
  | "LOCATION_MISMATCH";

export interface ReadinessIssue {
  code: ReadinessIssueCode;
  message: string;
  severity: "info" | "warning" | "critical";
}

export interface ReadinessResult {
  vin: string;
  ready: boolean;
  score: number;
  issues: ReadinessIssue[];
}

export type EveningIssueCode =
  | "ZONE_MISMATCH"
  | "EXTERIOR_OPEN"
  | "UNLOCKED"
  | "STALE_DATA"
  | "CRITICAL_ENERGY"
  | "CRITICAL_HEALTH";

export interface EveningIssue {
  code: EveningIssueCode;
  message: string;
  severity: "warning" | "critical";
}

export interface EveningCheckResult {
  vin: string;
  issues: EveningIssue[];
  attentionNeeded: boolean;
}

export interface DashboardKpis {
  totalVehicles: number;
  readyForHandover: number;
  chargingIssues: number;
  healthAlerts: number;
  zoneMismatches: number;
  staleData: number;
}

export interface SimulateEventPayload {
  kind?: "location" | "exterior" | "battery" | "random";
  vin?: string;
}
