class VehicleModel {
  final String id;
  final String applicationNo;
  final String applicantId;
  final String applicantName;
  final String deptId;
  final String deptName;
  final String vehicleId;
  final String licensePlate;
  final String purpose;
  final String reason;
  final String origin;
  final double? originLongitude;
  final double? originLatitude;
  final String destination;
  final double? destLongitude;
  final double? destLatitude;
  final int passengerCount;
  final DateTime startTime;
  final DateTime endTime;
  final DateTime? actualReturnTime;
  final double startOdometer;
  final double endOdometer;
  final double actualCost;
  final String costRemark;
  final String status;
  final String approvalInstanceId;
  final DateTime createTime;
  final DateTime updateTime;

  const VehicleModel({
    required this.id,
    required this.applicationNo,
    required this.applicantId,
    required this.applicantName,
    required this.deptId,
    required this.deptName,
    this.vehicleId = '',
    this.licensePlate = '',
    required this.purpose,
    required this.reason,
    required this.origin,
    this.originLongitude,
    this.originLatitude,
    required this.destination,
    this.destLongitude,
    this.destLatitude,
    this.passengerCount = 1,
    required this.startTime,
    required this.endTime,
    this.actualReturnTime,
    this.startOdometer = 0.0,
    this.endOdometer = 0.0,
    this.actualCost = 0.0,
    this.costRemark = '',
    this.status = 'draft',
    this.approvalInstanceId = '',
    required this.createTime,
    required this.updateTime,
  });

  factory VehicleModel.fromJson(Map<String, dynamic> json) {
    return VehicleModel(
      id: json['id'] as String,
      applicationNo: json['applicationNo'] as String? ?? '',
      applicantId: json['applicantId'] as String? ?? '',
      applicantName: json['applicantName'] as String? ?? '',
      deptId: json['deptId'] as String? ?? '',
      deptName: json['deptName'] as String? ?? '',
      vehicleId: json['vehicleId'] as String? ?? '',
      licensePlate: json['licensePlate'] as String? ?? '',
      purpose: json['purpose'] as String? ?? '',
      reason: json['reason'] as String? ?? '',
      origin: json['origin'] as String? ?? '',
      originLongitude: (json['originLongitude'] as num?)?.toDouble(),
      originLatitude: (json['originLatitude'] as num?)?.toDouble(),
      destination: json['destination'] as String? ?? '',
      destLongitude: (json['destLongitude'] as num?)?.toDouble(),
      destLatitude: (json['destLatitude'] as num?)?.toDouble(),
      passengerCount: json['passengerCount'] as int? ?? 1,
      startTime: DateTime.parse(json['startTime'] as String),
      endTime: DateTime.parse(json['endTime'] as String),
      actualReturnTime: json['actualReturnTime'] != null
          ? DateTime.parse(json['actualReturnTime'] as String)
          : null,
      startOdometer: (json['startOdometer'] as num?)?.toDouble() ?? 0.0,
      endOdometer: (json['endOdometer'] as num?)?.toDouble() ?? 0.0,
      actualCost: (json['actualCost'] as num?)?.toDouble() ?? 0.0,
      costRemark: json['costRemark'] as String? ?? '',
      status: json['status'] as String? ?? 'draft',
      approvalInstanceId: json['approvalInstanceId'] as String? ?? '',
      createTime: DateTime.parse(json['createTime'] as String),
      updateTime: DateTime.parse(json['updateTime'] as String),
    );
  }

  Map<String, dynamic> toJson() => {
    'id': id,
    'applicationNo': applicationNo,
    'applicantId': applicantId,
    'applicantName': applicantName,
    'deptId': deptId,
    'deptName': deptName,
    'vehicleId': vehicleId,
    'licensePlate': licensePlate,
    'purpose': purpose,
    'reason': reason,
    'origin': origin,
    'originLongitude': originLongitude,
    'originLatitude': originLatitude,
    'destination': destination,
    'destLongitude': destLongitude,
    'destLatitude': destLatitude,
    'passengerCount': passengerCount,
    'startTime': startTime.toIso8601String(),
    'endTime': endTime.toIso8601String(),
    'actualReturnTime': actualReturnTime?.toIso8601String(),
    'startOdometer': startOdometer,
    'endOdometer': endOdometer,
    'actualCost': actualCost,
    'costRemark': costRemark,
    'status': status,
    'approvalInstanceId': approvalInstanceId,
    'createTime': createTime.toIso8601String(),
    'updateTime': updateTime.toIso8601String(),
  };

  VehicleModel copyWith({
    String? id,
    String? applicationNo,
    String? applicantId,
    String? applicantName,
    String? deptId,
    String? deptName,
    String? vehicleId,
    String? licensePlate,
    String? purpose,
    String? reason,
    String? origin,
    double? originLongitude,
    double? originLatitude,
    String? destination,
    double? destLongitude,
    double? destLatitude,
    int? passengerCount,
    DateTime? startTime,
    DateTime? endTime,
    DateTime? actualReturnTime,
    double? startOdometer,
    double? endOdometer,
    double? actualCost,
    String? costRemark,
    String? status,
    String? approvalInstanceId,
    DateTime? createTime,
    DateTime? updateTime,
  }) {
    return VehicleModel(
      id: id ?? this.id,
      applicationNo: applicationNo ?? this.applicationNo,
      applicantId: applicantId ?? this.applicantId,
      applicantName: applicantName ?? this.applicantName,
      deptId: deptId ?? this.deptId,
      deptName: deptName ?? this.deptName,
      vehicleId: vehicleId ?? this.vehicleId,
      licensePlate: licensePlate ?? this.licensePlate,
      purpose: purpose ?? this.purpose,
      reason: reason ?? this.reason,
      origin: origin ?? this.origin,
      originLongitude: originLongitude ?? this.originLongitude,
      originLatitude: originLatitude ?? this.originLatitude,
      destination: destination ?? this.destination,
      destLongitude: destLongitude ?? this.destLongitude,
      destLatitude: destLatitude ?? this.destLatitude,
      passengerCount: passengerCount ?? this.passengerCount,
      startTime: startTime ?? this.startTime,
      endTime: endTime ?? this.endTime,
      actualReturnTime: actualReturnTime ?? this.actualReturnTime,
      startOdometer: startOdometer ?? this.startOdometer,
      endOdometer: endOdometer ?? this.endOdometer,
      actualCost: actualCost ?? this.actualCost,
      costRemark: costRemark ?? this.costRemark,
      status: status ?? this.status,
      approvalInstanceId: approvalInstanceId ?? this.approvalInstanceId,
      createTime: createTime ?? this.createTime,
      updateTime: updateTime ?? this.updateTime,
    );
  }
}
