// To parse this JSON data, do
//
//     final wishlist = wishlistFromJson(jsonString);

import 'dart:convert';

List<Wishlist> wishlistFromJson(String str) => List<Wishlist>.from(json.decode(str).map((x) => Wishlist.fromJson(x)));

String wishlistToJson(List<Wishlist> data) => json.encode(List<dynamic>.from(data.map((x) => x.toJson())));

class Wishlist {
  Wishlist({
    this.languageId,
    this.id,
    this.productAttributes,
    this.customerEnteredPrice,
    this.quantity,
    this.discountAmountInclTax,
    this.subtotal,
    this.subtotalWithVat,
    this.subtotalVatAmount,
    this.subtotalVatRate,
    this.currency,
    this.currencyn,
    this.rentalStartDateUtc,
    this.rentalEndDateUtc,
    this.createdOnUtc,
    this.updatedOnUtc,
    this.shoppingCartType,
    this.productId,
    this.product,
    this.customerId,
    this.customer,
  });

  dynamic languageId;
  dynamic id;
  List<dynamic>? productAttributes;
  dynamic customerEnteredPrice;
  dynamic quantity;
  dynamic discountAmountInclTax;
  dynamic subtotal;
  dynamic subtotalWithVat;
  dynamic subtotalVatAmount;
  dynamic subtotalVatRate;
  dynamic currency;
  dynamic currencyn;
  dynamic rentalStartDateUtc;
  dynamic rentalEndDateUtc;
  dynamic createdOnUtc;
  dynamic updatedOnUtc;
  dynamic shoppingCartType;
  dynamic productId;
  dynamic product;
  dynamic customerId;
  Customer? customer;

  factory Wishlist.fromJson(Map<String, dynamic> json) => Wishlist(
    languageId: json["language_id"],
    id: json["id"],
    productAttributes: List<dynamic>.from(json["product_attributes"].map((x) => x)),
    customerEnteredPrice: json["customer_entered_price"],
    quantity: json["quantity"],
    discountAmountInclTax: json["discount_amount_incl_tax"] != null ? json["discount_amount_incl_tax"] :0.0,
    subtotal: json["subtotal"],
    subtotalWithVat: json["subtotal_with_vat"],
    subtotalVatAmount: json["subtotal_vat_amount"],
    subtotalVatRate: json["subtotal_vat_rate"],
    currency: json["currency"],
    currencyn: json["currencyn"],
    rentalStartDateUtc: json["rental_start_date_utc"] != null ? DateTime.parse(json["rental_start_date_utc"]) : DateTime.now(),
    rentalEndDateUtc: json["rental_end_date_utc"] != null ? DateTime.parse(json["rental_end_date_utc"]) : DateTime.now(),
    createdOnUtc: DateTime.parse(json["created_on_utc"]),
    updatedOnUtc: DateTime.parse(json["updated_on_utc"]),
    shoppingCartType: json["shopping_cart_type"],
    productId: json["product_id"],
    product: Product.fromJson(json["product"]),
    customerId: json["customer_id"],
    customer: Customer.fromJson(json["customer"]),
  );

  Map<String, dynamic> toJson() => {
    "language_id": languageId,
    "id": id,
    "product_attributes": List<dynamic>.from(productAttributes!.map((x) => x)),
    "customer_entered_price": customerEnteredPrice,
    "quantity": quantity,
    "discount_amount_incl_tax": discountAmountInclTax,
    "subtotal": subtotal,
    "subtotal_with_vat": subtotalWithVat,
    "subtotal_vat_amount": subtotalVatAmount,
    "subtotal_vat_rate": subtotalVatRate,
    "currency": currency,
    "currencyn": currencyn,
    "rental_start_date_utc": rentalStartDateUtc,
    "rental_end_date_utc": rentalEndDateUtc,
    "created_on_utc": createdOnUtc.toIso8601String(),
    "updated_on_utc": updatedOnUtc.toIso8601String(),
    "shopping_cart_type": shoppingCartType,
    "product_id": productId,
    "product": product.toJson(),
    "customer_id": customerId,
    "customer": customer!.toJson(),
  };
}

class Customer {
  Customer({
    this.billingAddress,
    this.shippingAddress,
    this.addresses,
    this.id,
    this.username,
    this.email,
    this.firstName,
    this.lastName,
    this.languageId,
    this.adminComment,
    this.isTaxExempt,
    this.hasShoppingCartItems,
    this.active,
    this.deleted,
    this.isSystemAccount,
    this.systemName,
    this.lastIpAddress,
    this.createdOnUtc,
    this.lastLoginDateUtc,
    this.lastActivityDateUtc,
    this.registeredInStoreId,
    this.roleIds,
  });

  Address? billingAddress;
  Address? shippingAddress;
  List<Address>? addresses;
  String? id;
  String? username;
  String? email;
  dynamic firstName;
  dynamic lastName;
  dynamic languageId;
  dynamic adminComment;
  bool? isTaxExempt;
  bool? hasShoppingCartItems;
  bool? active;
  bool? deleted;
  bool? isSystemAccount;
  dynamic systemName;
  String? lastIpAddress;
  DateTime? createdOnUtc;
  DateTime? lastLoginDateUtc;
  DateTime? lastActivityDateUtc;
  dynamic registeredInStoreId;
  List<dynamic>? roleIds;

  factory Customer.fromJson(Map<String, dynamic> json) => Customer(
    billingAddress: Address.fromJson(json["billing_address"]),
    shippingAddress: Address.fromJson(json["shipping_address"]),
    addresses: List<Address>.from(json["addresses"].map((x) => Address.fromJson(x))),
    id: json["id"],
    username: json["username"],
    email: json["email"],
    firstName: json["first_name"],
    lastName: json["last_name"],
    languageId: json["language_id"],
    adminComment: json["admin_comment"],
    isTaxExempt: json["is_tax_exempt"],
    hasShoppingCartItems: json["has_shopping_cart_items"],
    active: json["active"],
    deleted: json["deleted"],
    isSystemAccount: json["is_system_account"],
    systemName: json["system_name"],
    lastIpAddress: json["last_ip_address"],
    createdOnUtc: DateTime.parse(json["created_on_utc"]),
    lastLoginDateUtc: json["last_login_date_utc"] != null ? DateTime.parse(json["last_login_date_utc"]) : DateTime.now(),
    lastActivityDateUtc: DateTime.parse(json["last_activity_date_utc"]),
    registeredInStoreId: json["registered_in_store_id"],
    roleIds: List<dynamic>.from(json["role_ids"].map((x) => x)),
  );

  Map<String, dynamic> toJson() => {
    "billing_address": billingAddress!.toJson(),
    "shipping_address": shippingAddress!.toJson(),
    "addresses": List<dynamic>.from(addresses!.map((x) => x.toJson())),
    "id": id,
    "username": username,
    "email": email,
    "first_name": firstName,
    "last_name": lastName,
    "language_id": languageId,
    "admin_comment": adminComment,
    "is_tax_exempt": isTaxExempt,
    "has_shopping_cart_items": hasShoppingCartItems,
    "active": active,
    "deleted": deleted,
    "is_system_account": isSystemAccount,
    "system_name": systemName,
    "last_ip_address": lastIpAddress,
    "created_on_utc": createdOnUtc!.toIso8601String(),
    "last_login_date_utc": lastLoginDateUtc!.toIso8601String(),
    "last_activity_date_utc": lastActivityDateUtc!.toIso8601String(),
    "registered_in_store_id": registeredInStoreId,
    "role_ids": List<dynamic>.from(roleIds!.map((x) => x)),
  };
}

class Address {
  Address({
    this.id,
    this.firstName,
    this.lastName,
    this.email,
    this.company,
    this.countryId,
    this.country,
    this.stateProvinceId,
    this.city,
    this.address1,
    this.address2,
    this.zipPostalCode,
    this.phoneNumber,
    this.faxNumber,
    this.customerAttributes,
    this.createdOnUtc,
    this.province,
    this.latLong,
  });

  String? id;
  FirstName? firstName;
  LastName? lastName;
  Email? email;
  dynamic company;
  dynamic countryId;
  Country? country;
  dynamic stateProvinceId;
  City? city;
  String? address1;
  String? address2;
  String? zipPostalCode;
  String? phoneNumber;
  dynamic faxNumber;
  String? customerAttributes;
  DateTime? createdOnUtc;
  dynamic province;
  String? latLong;

  factory Address.fromJson(Map<String, dynamic> json) => Address(
    id: json["id"],
    firstName: firstNameValues.map![json["first_name"]],
    lastName: lastNameValues.map![json["last_name"]],
    email: emailValues.map![json["email"]],
    company: json["company"],
    countryId: json["country_id"],
    country: countryValues.map![json["country"]],
    stateProvinceId: json["state_province_id"],
    city: cityValues.map![json["city"]],
    address1: json["address1"],
    address2: json["address2"],
    zipPostalCode: json["zip_postal_code"],
    phoneNumber: json["phone_number"],
    faxNumber: json["fax_number"],
    customerAttributes: json["customer_attributes"],
    createdOnUtc: DateTime.parse(json["created_on_utc"]),
    province: json["province"],
    latLong: json["lat_long"],
  );

  Map<String, dynamic> toJson() => {
    "id": id,
    "first_name": firstNameValues.reverse[firstName],
    "last_name": lastNameValues.reverse[lastName],
    "email": emailValues.reverse[email],
    "company": company,
    "country_id": countryId,
    "country": countryValues.reverse[country],
    "state_province_id": stateProvinceId,
    "city": cityValues.reverse[city],
    "address1": address1,
    "address2": address2,
    "zip_postal_code": zipPostalCode,
    "phone_number": phoneNumber,
    "fax_number": faxNumber,
    "customer_attributes": customerAttributes,
    "created_on_utc": createdOnUtc!.toIso8601String(),
    "province": province,
    "lat_long": latLong,
  };
}

enum City { RIYADH, AL_OYUN }

final cityValues = EnumValues({
  "Al Oyun": City.AL_OYUN,
  "Riyadh": City.RIYADH
});

enum Country { SAUDI_ARABIA }

final countryValues = EnumValues({
  "Saudi Arabia": Country.SAUDI_ARABIA
});

enum Email { TAMER_FANASHEH_GMAIL_COM, TAMER_DASDASDAS_GMAIL_COM }

final emailValues = EnumValues({
  "Tamer.dasdasdas@gmail.com": Email.TAMER_DASDASDAS_GMAIL_COM,
  "Tamer.fanasheh@gmail.com": Email.TAMER_FANASHEH_GMAIL_COM
});

enum FirstName { TAMER, TAMER_FANASHEH }

final firstNameValues = EnumValues({
  "TAMER": FirstName.TAMER,
  "TAMER FANASHEH": FirstName.TAMER_FANASHEH
});

enum LastName { FANASHEH, MUSA }

final lastNameValues = EnumValues({
  "FANASHEH": LastName.FANASHEH,
  "MUSA": LastName.MUSA
});

class Product {
  Product({
    this.id,
    this.visibleIndividually,
    this.name,
    this.namen,
    this.localizedNames,
    this.shortDescription,
    this.shortDescriptionn,
    this.fullDescription,
    this.fullDescriptionn,
    this.markasNew,
    this.showOnHomePage,
//    this.metaKeywords,
//    this.metaDescription,
//    this.metaTitle,
    this.allowCustomerReviews,
    this.approvedRatingSum,
    this.notApprovedRatingSum,
    this.approvedTotalReviews,
    this.notApprovedTotalReviews,
    this.sku,
    this.isRx,
    this.prescriptionRequired,
    this.rxMessage,
    this.rxMessagen,
//    this.manufacturerPartNumber,
//    this.gtin,
    this.isGiftCard,
    this.requireOtherProducts,
    this.automaticallyAddRequiredProducts,
    this.isDownload,
    this.unlimitedDownloads,
    this.maxNumberOfDownloads,
//    this.downloadExpirationDays,
    this.hasSampleDownload,
    this.hasUserAgreement,
    this.isRecurring,
    this.recurringCycleLength,
    this.recurringTotalCycles,
    this.isRental,
    this.rentalPriceLength,
    this.isShipEnabled,
    this.isFreeShipping,
    this.shipSeparately,
    this.additionalShippingCharge,
    this.isTaxExempt,
    this.isTelecommunicationsOrBroadcastingOrElectronicServices,
    this.useMultipleWarehouses,
    this.manageInventoryMethodId,
    this.stockQuantity,
    this.stockAvailability,
    this.stockAvailabilityn,
    this.displayStockAvailability,
    this.displayStockQuantity,
    this.minStockQuantity,
    this.notifyAdminForQuantityBelow,
    this.allowBackInStockSubscriptions,
    this.orderMinimumQuantity,
    this.orderMaximumQuantity,
//    this.allowedQuantities,
    this.allowAddingOnlyExistingAttributeCombinations,
    this.disableBuyButton,
    this.disableWishlistButton,
    this.availableForPreOrder,
    this.preOrderAvailabilityStartDateTimeUtc,
    this.callForPrice,
    this.price,
    this.oldPrice,
    this.productCost,
    this.specialPrice,
    this.specialPriceStartDateTimeUtc,
    this.specialPriceEndDateTimeUtc,
    this.customerEntersPrice,
    this.minimumCustomerEnteredPrice,
    this.maximumCustomerEnteredPrice,
    this.basepriceEnabled,
    this.basepriceAmount,
    this.basepriceBaseAmount,
    this.hasTierPrices,
    this.hasDiscountsApplied,
    this.discountName,
    this.discountNamen,
    this.discountDescription,
    this.discountDescriptionn,
    this.discountPercentage,
    this.currency,
    this.currencyn,
    this.weight,
    this.length,
    this.width,
    this.height,
    this.availableStartDateTimeUtc,
    this.availableEndDateTimeUtc,
    this.displayOrder,
    this.published,
    this.deleted,
    this.createdOnUtc,
    this.updatedOnUtc,
    this.productType,
    this.parentGroupedProductId,
    this.roleIds,
    this.discountIds,
    this.storeIds,
    this.manufacturerIds,
    this.reviews,
    this.images,
    this.attributes,
    this.specifications,
    this.associatedProductIds,
    this.tags,
    this.vendorId,
    this.seName,
  });

  String? id;
  bool? visibleIndividually;
  String? name;
  String? namen;
  List<LocalizedName>? localizedNames;
  String? shortDescription;
  String? shortDescriptionn;
  String? fullDescription;
  String? fullDescriptionn;
  bool? markasNew;
  bool? showOnHomePage;
//  dynamic metaKeywords;
//  dynamic metaDescription;
//  dynamic metaTitle;
  bool? allowCustomerReviews;
  dynamic approvedRatingSum;
  dynamic notApprovedRatingSum;
  dynamic approvedTotalReviews;
  dynamic notApprovedTotalReviews;
  String? sku;
  bool? isRx;
  bool? prescriptionRequired;
  dynamic rxMessage;
  dynamic rxMessagen;
//  dynamic manufacturerPartNumber;
//  dynamic gtin;
  bool? isGiftCard;
  bool? requireOtherProducts;
  bool? automaticallyAddRequiredProducts;
  bool? isDownload;
  bool? unlimitedDownloads;
  dynamic maxNumberOfDownloads;
//  dynamic downloadExpirationDays;
  bool? hasSampleDownload;
  bool? hasUserAgreement;
  bool? isRecurring;
  dynamic recurringCycleLength;
  dynamic recurringTotalCycles;
  bool? isRental;
  dynamic rentalPriceLength;
  bool? isShipEnabled;
  bool? isFreeShipping;
  bool? shipSeparately;
  dynamic additionalShippingCharge;
  bool? isTaxExempt;
  bool? isTelecommunicationsOrBroadcastingOrElectronicServices;
  bool? useMultipleWarehouses;
  dynamic manageInventoryMethodId;
  dynamic stockQuantity;
  String? stockAvailability;
  String? stockAvailabilityn;
  bool? displayStockAvailability;
  bool? displayStockQuantity;
  dynamic minStockQuantity;
  dynamic notifyAdminForQuantityBelow;
  bool? allowBackInStockSubscriptions;
  dynamic orderMinimumQuantity;
  dynamic orderMaximumQuantity;
//  dynamic allowedQuantities;
  bool? allowAddingOnlyExistingAttributeCombinations;
  bool? disableBuyButton;
  bool? disableWishlistButton;
  bool? availableForPreOrder;
  dynamic preOrderAvailabilityStartDateTimeUtc;
  bool? callForPrice;
  double? price;
  dynamic oldPrice;
  double? productCost;
  dynamic specialPrice;
  dynamic specialPriceStartDateTimeUtc;
  dynamic specialPriceEndDateTimeUtc;
  bool? customerEntersPrice;
  dynamic minimumCustomerEnteredPrice;
  dynamic maximumCustomerEnteredPrice;
  bool? basepriceEnabled;
  dynamic basepriceAmount;
  dynamic basepriceBaseAmount;
  bool? hasTierPrices;
  bool? hasDiscountsApplied;
  dynamic discountName;
  dynamic discountNamen;
  dynamic discountDescription;
  dynamic discountDescriptionn;
  dynamic discountPercentage;
  String? currency;
  String? currencyn;
  double? weight;
  dynamic length;
  dynamic width;
  dynamic height;
  dynamic availableStartDateTimeUtc;
  dynamic availableEndDateTimeUtc;
  dynamic displayOrder;
  bool? published;
  bool? deleted;
  DateTime? createdOnUtc;
  DateTime? updatedOnUtc;
  String? productType;
  dynamic parentGroupedProductId;
  List<dynamic>? roleIds;
  List<dynamic>? discountIds;
  List<dynamic>? storeIds;
  List<dynamic>? manufacturerIds;
  List<dynamic>? reviews;
  List<Image>? images;
  List<dynamic>? attributes;
  List<Specification>? specifications;
  List<dynamic>? associatedProductIds;
  List<dynamic>? tags;
  dynamic vendorId;
  String? seName;

  factory Product.fromJson(Map<String, dynamic> json) => Product(
    id: json["id"],
    visibleIndividually: json["visible_individually"],
    name: json["name"],
    namen: json["namen"],
    localizedNames: List<LocalizedName>.from(json["localized_names"].map((x) => LocalizedName.fromJson(x))),
    shortDescription: json["short_description"],
    shortDescriptionn: json["short_descriptionn"],
    fullDescription: json["full_description"],
    fullDescriptionn: json["full_descriptionn"],
    markasNew: json["markas_new"],
    showOnHomePage: json["show_on_home_page"],
//    metaKeywords: json["meta_keywords"],
//    metaDescription: json["meta_description"],
//    metaTitle: json["meta_title"],
    allowCustomerReviews: json["allow_customer_reviews"],
    approvedRatingSum: json["approved_rating_sum"],
    notApprovedRatingSum: json["not_approved_rating_sum"],
    approvedTotalReviews: json["approved_total_reviews"],
    notApprovedTotalReviews: json["not_approved_total_reviews"],
    sku: json["sku"],
    isRx: json["is_rx"],
    prescriptionRequired: json["prescription_required"],
    rxMessage: json["rx_message"] != null ? json["rx_message"] : "" ,
    rxMessagen: json["rx_messagen"] != null ? json["rx_messagen"] : "",
//    manufacturerPartNumber: json["manufacturer_part_number"],
//    gtin: json["gtin"],
    isGiftCard: json["is_gift_card"],
    requireOtherProducts: json["require_other_products"],
    automaticallyAddRequiredProducts: json["automatically_add_required_products"],
    isDownload: json["is_download"],
    unlimitedDownloads: json["unlimited_downloads"],
    maxNumberOfDownloads: json["max_number_of_downloads"],
//    downloadExpirationDays: json["download_expiration_days"],
    hasSampleDownload: json["has_sample_download"],
    hasUserAgreement: json["has_user_agreement"],
    isRecurring: json["is_recurring"],
    recurringCycleLength: json["recurring_cycle_length"],
    recurringTotalCycles: json["recurring_total_cycles"],
    isRental: json["is_rental"],
    rentalPriceLength: json["rental_price_length"],
    isShipEnabled: json["is_ship_enabled"],
    isFreeShipping: json["is_free_shipping"],
    shipSeparately: json["ship_separately"],
    additionalShippingCharge: json["additional_shipping_charge"],
    isTaxExempt: json["is_tax_exempt"],
    isTelecommunicationsOrBroadcastingOrElectronicServices: json["is_telecommunications_or_broadcasting_or_electronic_services"],
    useMultipleWarehouses: json["use_multiple_warehouses"],
    manageInventoryMethodId: json["manage_inventory_method_id"],
    stockQuantity: json["stock_quantity"],
    stockAvailability: json["stock_availability"],
    stockAvailabilityn: json["stock_availabilityn"],
    displayStockAvailability: json["display_stock_availability"],
    displayStockQuantity: json["display_stock_quantity"],
    minStockQuantity: json["min_stock_quantity"],
    notifyAdminForQuantityBelow: json["notify_admin_for_quantity_below"],
    allowBackInStockSubscriptions: json["allow_back_in_stock_subscriptions"],
    orderMinimumQuantity: json["order_minimum_quantity"],
    orderMaximumQuantity: json["order_maximum_quantity"],
//    allowedQuantities: json["allowed_quantities"],
    allowAddingOnlyExistingAttributeCombinations: json["allow_adding_only_existing_attribute_combinations"],
    disableBuyButton: json["disable_buy_button"],
    disableWishlistButton: json["disable_wishlist_button"],
    availableForPreOrder: json["available_for_pre_order"],
    preOrderAvailabilityStartDateTimeUtc: json["pre_order_availability_start_date_time_utc"] != null ? DateTime.parse(json["pre_order_availability_start_date_time_utc"]) : DateTime.now(),
    callForPrice: json["call_for_price"],
    price: json["price"].toDouble(),
    oldPrice: json["old_price"],
    productCost: json["product_cost"].toDouble(),
    specialPrice: json["special_price"] != null ? json["special_price"] : 0.0 ,
    specialPriceStartDateTimeUtc: json["special_price_start_date_time_utc"] != null ? DateTime.parse(json["special_price_start_date_time_utc"]) : DateTime.now(),
    specialPriceEndDateTimeUtc: json["special_price_end_date_time_utc"] != null ? DateTime.parse(json["special_price_end_date_time_utc"]) : DateTime.now(),
    customerEntersPrice: json["customer_enters_price"],
    minimumCustomerEnteredPrice: json["minimum_customer_entered_price"],
    maximumCustomerEnteredPrice: json["maximum_customer_entered_price"],
    basepriceEnabled: json["baseprice_enabled"],
    basepriceAmount: json["baseprice_amount"],
    basepriceBaseAmount: json["baseprice_base_amount"],
    hasTierPrices: json["has_tier_prices"],
    hasDiscountsApplied: json["has_discounts_applied"],
    discountName: json["discount_name"],
    discountNamen: json["discount_namen"],
    discountDescription: json["discount_description"],
    discountDescriptionn: json["discount_Descriptionn"],
    discountPercentage: json["discount_percentage"],
    currency: json["currency"],
    currencyn: json["currencyn"],
    weight: json["weight"].toDouble(),
    length: json["length"],
    width: json["width"],
    height: json["height"],
    availableStartDateTimeUtc: json["available_start_date_time_utc"],
    availableEndDateTimeUtc: json["available_end_date_time_utc"],
    displayOrder: json["display_order"],
    published: json["published"],
    deleted: json["deleted"],
    createdOnUtc: DateTime.parse(json["created_on_utc"]),
    updatedOnUtc: DateTime.parse(json["updated_on_utc"]),
    productType: json["product_type"],
    parentGroupedProductId: json["parent_grouped_product_id"],
    roleIds: List<dynamic>.from(json["role_ids"].map((x) => x)),
    discountIds: List<dynamic>.from(json["discount_ids"].map((x) => x)),
    storeIds: List<dynamic>.from(json["store_ids"].map((x) => x)),
    manufacturerIds: List<int>.from(json["manufacturer_ids"].map((x) => x)),
    reviews: List<dynamic>.from(json["reviews"].map((x) => x)),
    images: List<Image>.from(json["images"].map((x) => Image.fromJson(x))),
    attributes: List<dynamic>.from(json["attributes"].map((x) => x)),
    specifications: List<Specification>.from(json["specifications"].map((x) => Specification.fromJson(x))),
    associatedProductIds: List<dynamic>.from(json["associated_product_ids"].map((x) => x)),
    tags: List<dynamic>.from(json["tags"].map((x) => x)),
    vendorId: json["vendor_id"],
    seName: json["se_name"],
  );

  Map<String, dynamic> toJson() => {
    "id": id,
    "visible_individually": visibleIndividually,
    "name": name,
    "namen": namen,
    "localized_names": List<dynamic>.from(localizedNames!.map((x) => x.toJson())),
    "short_description": shortDescription,
    "short_descriptionn": shortDescriptionn,
    "full_description": fullDescription,
    "full_descriptionn": fullDescriptionn,
    "markas_new": markasNew,
    "show_on_home_page": showOnHomePage,
//    "meta_keywords": metaKeywords,
//    "meta_description": metaDescription,
//    "meta_title": metaTitle,
    "allow_customer_reviews": allowCustomerReviews,
    "approved_rating_sum": approvedRatingSum,
    "not_approved_rating_sum": notApprovedRatingSum,
    "approved_total_reviews": approvedTotalReviews,
    "not_approved_total_reviews": notApprovedTotalReviews,
    "sku": sku,
    "is_rx": isRx,
    "prescription_required": prescriptionRequired,
    "rx_message": rxMessage,
    "rx_messagen": rxMessagen,
//    "manufacturer_part_number": manufacturerPartNumber,
//    "gtin": gtin,
    "is_gift_card": isGiftCard,
    "require_other_products": requireOtherProducts,
    "automatically_add_required_products": automaticallyAddRequiredProducts,
    "is_download": isDownload,
    "unlimited_downloads": unlimitedDownloads,
    "max_number_of_downloads": maxNumberOfDownloads,
//    "download_expiration_days": downloadExpirationDays,
    "has_sample_download": hasSampleDownload,
    "has_user_agreement": hasUserAgreement,
    "is_recurring": isRecurring,
    "recurring_cycle_length": recurringCycleLength,
    "recurring_total_cycles": recurringTotalCycles,
    "is_rental": isRental,
    "rental_price_length": rentalPriceLength,
    "is_ship_enabled": isShipEnabled,
    "is_free_shipping": isFreeShipping,
    "ship_separately": shipSeparately,
    "additional_shipping_charge": additionalShippingCharge,
    "is_tax_exempt": isTaxExempt,
    "is_telecommunications_or_broadcasting_or_electronic_services": isTelecommunicationsOrBroadcastingOrElectronicServices,
    "use_multiple_warehouses": useMultipleWarehouses,
    "manage_inventory_method_id": manageInventoryMethodId,
    "stock_quantity": stockQuantity,
    "stock_availability": stockAvailability,
    "stock_availabilityn": stockAvailabilityn,
    "display_stock_availability": displayStockAvailability,
    "display_stock_quantity": displayStockQuantity,
    "min_stock_quantity": minStockQuantity,
    "notify_admin_for_quantity_below": notifyAdminForQuantityBelow,
    "allow_back_in_stock_subscriptions": allowBackInStockSubscriptions,
    "order_minimum_quantity": orderMinimumQuantity,
    "order_maximum_quantity": orderMaximumQuantity,
//    "allowed_quantities": allowedQuantities,
    "allow_adding_only_existing_attribute_combinations": allowAddingOnlyExistingAttributeCombinations,
    "disable_buy_button": disableBuyButton,
    "disable_wishlist_button": disableWishlistButton,
    "available_for_pre_order": availableForPreOrder,
    "pre_order_availability_start_date_time_utc": preOrderAvailabilityStartDateTimeUtc,
    "call_for_price": callForPrice,
    "price": price,
    "old_price": oldPrice,
    "product_cost": productCost,
    "special_price": specialPrice,
    "special_price_start_date_time_utc": specialPriceStartDateTimeUtc,
    "special_price_end_date_time_utc": specialPriceEndDateTimeUtc,
    "customer_enters_price": customerEntersPrice,
    "minimum_customer_entered_price": minimumCustomerEnteredPrice,
    "maximum_customer_entered_price": maximumCustomerEnteredPrice,
    "baseprice_enabled": basepriceEnabled,
    "baseprice_amount": basepriceAmount,
    "baseprice_base_amount": basepriceBaseAmount,
    "has_tier_prices": hasTierPrices,
    "has_discounts_applied": hasDiscountsApplied,
    "discount_name": discountName,
    "discount_namen": discountNamen,
    "discount_description": discountDescription,
    "discount_Descriptionn": discountDescriptionn,
    "discount_percentage": discountPercentage,
    "currency": currency,
    "currencyn": currencyn,
    "weight": weight,
    "length": length,
    "width": width,
    "height": height,
    "available_start_date_time_utc": availableStartDateTimeUtc,
    "available_end_date_time_utc": availableEndDateTimeUtc,
    "display_order": displayOrder,
    "published": published,
    "deleted": deleted,
    "created_on_utc": createdOnUtc!.toIso8601String(),
    "updated_on_utc": updatedOnUtc!.toIso8601String(),
    "product_type": productType,
    "parent_grouped_product_id": parentGroupedProductId,
    "role_ids": List<dynamic>.from(roleIds!.map((x) => x)),
    "discount_ids": List<dynamic>.from(discountIds!.map((x) => x)),
    "store_ids": List<dynamic>.from(storeIds!.map((x) => x)),
    "manufacturer_ids": List<dynamic>.from(manufacturerIds!.map((x) => x)),
    "reviews": List<dynamic>.from(reviews!.map((x) => x)),
    "images": List<dynamic>.from(images!.map((x) => x.toJson())),
    "attributes": List<dynamic>.from(attributes!.map((x) => x)),
    "specifications": List<dynamic>.from(specifications!.map((x) => x.toJson())),
    "associated_product_ids": List<dynamic>.from(associatedProductIds!.map((x) => x)),
    "tags": List<dynamic>.from(tags!.map((x) => x)),
    "vendor_id": vendorId,
    "se_name": seName,
  };
}

class Image {
  Image({
    this.id,
    this.position,
    this.src,
    this.thumb,
    this.attachment,
  });

  dynamic id;
  dynamic position;
  String? src;
  String? thumb;
  String? attachment;

  factory Image.fromJson(Map<String, dynamic> json) => Image(
    id: json["id"],
    position: json["position"],
    src: json["src"],
    thumb: json["thumb"],
    attachment: json["attachment"],
  );

  Map<String, dynamic> toJson() => {
    "id": id,
    "position": position,
    "src": src,
    "thumb": thumb,
    "attachment": attachment,
  };
}

class LocalizedName {
  LocalizedName({
    this.languageId,
    this.localizedName,
  });

  dynamic languageId;
  String? localizedName;

  factory LocalizedName.fromJson(Map<String, dynamic> json) => LocalizedName(
    languageId: json["language_id"],
    localizedName: json["localized_name"],
  );

  Map<String, dynamic> toJson() => {
    "language_id": languageId,
    "localized_name": localizedName,
  };
}

class Specification {
  Specification({
    this.id,
    this.displayOrder,
    this.defaultValue,
    this.defaultValuen,
    this.name,
    this.nameN,
  });

  dynamic id;
  dynamic displayOrder;
  String? defaultValue;
  String? defaultValuen;
  String? name;
  String? nameN;

  factory Specification.fromJson(Map<String, dynamic> json) => Specification(
    id: json["id"],
    displayOrder: json["display_order"],
    defaultValue: json["default_value"],
    defaultValuen: json["default_valuen"],
    name: json["name"],
    nameN: json["nameN"],
  );

  Map<String, dynamic> toJson() => {
    "id": id,
    "display_order": displayOrder,
    "default_value": defaultValue,
    "default_valuen": defaultValuen,
    "name": name,
    "nameN": nameN,
  };
}

class EnumValues<T> {
  Map<String, T>? map;
  Map<T, String>? reverseMap;

  EnumValues(this.map);

  Map<T, String> get reverse {
    if (reverseMap == null) {
      reverseMap = map!.map((k, v) => new MapEntry(v, k));
    }
    return reverseMap!;
  }
}
