import 'package:concierge/data/remote/converters/flag_converter.dart';
import 'package:concierge/data/remote/models/media_image.dart';
import 'package:json_annotation/json_annotation.dart';

part '../../../_generated/data/remote/models/product.g.dart';

@JsonSerializable(fieldRename: FieldRename.snake)
class Product {
  final int id;
  final String title;
  final String subTitle;
  final String body;
  final String allergies;
  final double price;
  final double? priceComwellClub;
  final String estimatedDeliveryTime;
  @FlagConverter()
  final bool isNew;
  final List<MediaImage> images;
  final List<Option> options;
  final String type;

  Product({
    required this.id,
    required this.title,
    required this.subTitle,
    required this.body,
    required this.allergies,
    required this.price,
    required this.priceComwellClub,
    required this.estimatedDeliveryTime,
    required this.isNew,
    required this.images,
    required this.options,
    required this.type,
  });

  factory Product.fromJson(Map<String, dynamic> json) => _$ProductFromJson(json);

  Map<String, dynamic> toJson() => _$ProductToJson(this);
}

@JsonSerializable(fieldRename: FieldRename.snake)
class Option {
  final int id;
  final String name;
  final int productId;
  final List<Answer> answers;

  const Option({
    required this.id,
    required this.name,
    required this.productId,
    required this.answers,
  });

  factory Option.fromJson(Map<String, dynamic> json) => _$OptionFromJson(json);

  Map<String, dynamic> toJson() => _$OptionToJson(this);
}

@JsonSerializable(fieldRename: FieldRename.snake)
class Answer {
  final int id;
  final String name;
  final int isDefault;
  final int productOptionId;
  final bool isSelected;

  const Answer({
    required this.id,
    required this.name,
    required this.isDefault,
    required this.productOptionId,
    required this.isSelected,
  });

  factory Answer.fromJson(Map<String, dynamic> json) => _$AnswerFromJson(json);

  Map<String, dynamic> toJson() => _$AnswerToJson(this);
}