import 'package:test_sa/models/device/supplier.dart';

class ModelDefinition {
  ModelDefinition({
    this.id,
    this.assetName,
    this.assetDescription,
    this.modelDefCode,
    this.modelName,
    this.manufacturerId,
    this.manufacturerName,
    this.supplierName,
    this.replacementDate,
    this.essentialEquipement,
    this.businessCritical,
    this.lifeSpan,
    this.modelDefRelatedDefects,
    this.suppliers,
  });

  ModelDefinition.fromJson(dynamic json) {
    id = json['id'];
    assetName = json['assetName'];
    assetDescription = json['assetDescription'];
    modelDefCode = json['modelDefCode'];
    modelName = json['modelName'];
    manufacturerId = json['manufacturerId'];
    manufacturerName = json['manufacturerName'];
    supplierName = json['supplierName'];
    replacementDate = json['replacementDate'];
    essentialEquipement = json['essentialEquipement'];
    businessCritical = json['businessCritical'];
    lifeSpan = json['lifeSpan'];
    if (json['modelDefRelatedDefects'] != null) {
      modelDefRelatedDefects = [];
      json['modelDefRelatedDefects'].forEach((v) {
        modelDefRelatedDefects!.add(ModelDefRelatedDefects.fromJson(v)); // Use '!' since modelDefRelatedDefects is initialized here
      });
    }

    if (json['oracleCodes'] != null) {
      oracleCodes = [];
      json['oracleCodes'].forEach((v) {
        oracleCodes!.add(OracleCode.fromJson(v)); // Use '!' since modelDefRelatedDefects is initialized here
      });
    }
    if (json['suppliers'] != null) {
      suppliers = [];
      json['suppliers'].forEach((v) {
        suppliers!.add(Supplier.fromJson(v)); // Use '!' since suppliers is initialized here
      });
    }
  }

  num? id; // Now nullable
  String? assetName; // Now nullable
  String? assetDescription; // Now nullable
  String? modelDefCode; // Now nullable
  String? modelName; // Now nullable
  num? manufacturerId; // Now nullable
  String? manufacturerName; // Now nullable
  String? supplierName; // Remains dynamic asit can hold various types
  String? replacementDate; // Now nullable
  String? essentialEquipement; // Now nullable
  String? businessCritical; // Now nullable
  num? lifeSpan; // Now nullable
  List<ModelDefRelatedDefects>? modelDefRelatedDefects; // Now nullable
  List<Supplier>? suppliers; // Now nullable
  List<OracleCode>? oracleCodes; // Now nullable

  // ... (copyWith method remains the same, just with nullable parameters)

  Map<String, dynamic> toJson() {
    final map = <String, dynamic>{};
    map['id'] = id;
    map['assetName'] = assetName;
    // ... (rest of the toJson method remains the same, no need for null-aware operator here as properties are already checked for null in the if conditions)
    if (modelDefRelatedDefects != null) {
      map['modelDefRelatedDefects'] = modelDefRelatedDefects!.map((v) => v.toJson()).toList(); // Use '!' since modelDefRelatedDefects could be null
    }
    if (suppliers != null) {
      map['suppliers'] = suppliers!.map((v) => v.toJson()).toList(); // Use '!' since suppliers could be null
    }
    return map;
  }
}

class ModelDefRelatedDefects {
  ModelDefRelatedDefects({
    this.id,
    this.defectName,
    this.workPerformed,
    this.estimatedTime,
  });

  ModelDefRelatedDefects.fromJson(dynamic json) {
    id = json['id'];
    defectName = json['defectName'];
    workPerformed = json['workPerformed'];
    estimatedTime = json['estimatedTime'];
  }

  num? id; // Now nullable
  String? defectName; // Now nullable
  String? workPerformed; // Now nullable
  String? estimatedTime; // Now nullable

  // ... (copyWith method remains the same, just with nullable parameters)

  Map<String, dynamic> toJson() {
    final map = <String, dynamic>{};
    map['id'] = id;
    map['defectName'] = defectName;
    map['workPerformed'] = workPerformed;
    map['estimatedTime'] = estimatedTime;
    return map;
  }
}

class OracleCode {
  int? id;
  int? assetNDId;
  int? codeTypeId;
  String? codeTypeName;
  int? codeTypeValue;
  String? codeValue;

  OracleCode({this.id, this.assetNDId, this.codeTypeId, this.codeTypeName, this.codeTypeValue, this.codeValue});

  OracleCode.fromJson(Map<String, dynamic> json) {
    id = json['id'];
    assetNDId = json['assetNDId'];
    codeTypeId = json['codeTypeId'];
    codeTypeName = json['codeTypeName'];
    codeTypeValue = json['codeTypeValue'];
    codeValue = json['codeValue'];
  }

  Map<String, dynamic> toJson() {
    final Map<String, dynamic> data = new Map<String, dynamic>();
    data['id'] = this.id;
    data['assetNDId'] = this.assetNDId;
    data['codeTypeId'] = this.codeTypeId;
    data['codeTypeName'] = this.codeTypeName;
    data['codeTypeValue'] = this.codeTypeValue;
    data['codeValue'] = this.codeValue;
    return data;
  }
}
