import 'package:yoshi_papas_app/models/models.dart';

import '../services/services.dart';
import 'basico_model.dart';

class Producto extends Basico {
  int? idCategoria;
  CategoriaProducto? categoria;
  String? nombre;
  String? descripcion;
  String? imagen;
  int? venta;
  int? existencia;
  double? precio;
  int? verMenu;
  String? codigo;
  String? descuento;
  int? toping;
  List<Producto>? topings;
  int? activo;

  Producto({
    super.id,
    this.idCategoria,
    this.nombre,
    this.descripcion,
    this.imagen,
    this.venta,
    this.existencia,
    this.precio,
    this.verMenu,
    this.codigo,
    this.descuento,
    this.toping,
    this.topings,
    this.activo,
  });

  @override
  Map<String, dynamic> toJson() {
    print("Convirtiendo Producto a JSON");
    print("ID: $id, Categoria: $idCategoria, Nombre: $nombre");
    print("Descripcion: $descripcion, imagen: $imagen, venta: $venta");
    print("existencia: $existencia, precio: $precio, verMenu: $verMenu");
    print("codigo: $codigo, descuento: $descuento, creado: $creado");
    print("eliminado: $eliminado, modificado: $modificado");

    return {
      'id': id,
      'idCategoria': idCategoria ?? 0,
      'nombre': nombre ?? '',
      'descripcion': descripcion ?? '',
      'imagen': imagen ?? '',
      'venta': venta ?? 0,
      'existencia': existencia ?? 0,
      'precio': precio ?? 0.0,
      'verMenu': verMenu ?? 0,
      'codigo': codigo ?? '',
      'descuento': descuento ?? '',
      'toping': toping ?? 0,
      'activo': activo ?? 0,
      'creado': creado?.toIso8601String(),
      'modificado': modificado?.toIso8601String(),
      'eliminado': eliminado?.toIso8601String(),
    }..addAll(super.toJson());
  }

  Map<String, dynamic> toMap() {
    return {
      'id': id,
      'idCategoria': idCategoria,
      'nombre': nombre,
      'descripcion': descripcion,
      'imagen': imagen,
      'venta': venta,
      'existencia': existencia,
      'precio': precio,
      'verMenu': verMenu,
      'codigo': codigo,
      'descuento': descuento,
      'toping': toping,
      'activo': activo,
      'creado': creado != null ? creado!.toIso8601String() : null,
      'modificado': modificado != null ? modificado!.toIso8601String() : null,
      'eliminado': eliminado != null ? eliminado!.toIso8601String() : null,
    };
  }

  Producto.fromJson(Map<String, dynamic> json) {
    super.parseJson(json);
    idCategoria = Basico.parseInt(json['idCategoria']);
    // categoria = json["categoria"] != null
    //     ? CategoriaProducto.fromJson(json["categoria"])
    //     : null;
    nombre = Basico.parseString(json['nombre']);
    descripcion = Basico.parseString(json['descripcion']);
    imagen = Basico.parseString(json['imagen']);
    venta = Basico.parseInt(json['venta']);
    existencia = Basico.parseInt(json['existencia']);
    precio = Basico.parseDouble(json['precio']);
    verMenu = Basico.parseInt(json['verMenu']);
    codigo = Basico.parseString(json['codigo']);
    descuento = Basico.parseString(json['descuento']);
    activo = Basico.parseInt(json['activo']);
    if (json['toping'] is bool) {
      toping = json['toping'] ? 1 : 0;
    } else {
      toping = Basico.parseInt(json['toping']);
    }
    if (json['toppings'] != null) {
      topings = (json['toppings'] as List)
          .map((id) => Producto(id: id as int))
          .toList();
    }
  }

  Producto.fromApi(Map<String, dynamic> json) {
    super.parseJson(json);
    idCategoria = Basico.parseInt(json['idCategoria']);
    nombre = Basico.parseString(json['nombre']);
    descripcion = Basico.parseString(json['descripcion']);
    imagen = Basico.parseString(json['imagen']);
    venta = Basico.parseInt(json['venta']);
    existencia = Basico.parseInt(json['existencia']);
    precio = Basico.parseDouble(json['precio']);
    verMenu = Basico.parseInt(json['verEnMenu']);
    codigo = Basico.parseString(json['codigo']);
    descuento = Basico.parseString(json['descuento']);
    activo = Basico.parseInt(json['activo']);
    creado = Basico.parseDate(json['creado']);
    modificado = Basico.parseDate(json['modificado']);
    eliminado = Basico.parseDate(json['eliminado']);
  }

  Future<void> guardar() async {
    idLocal = await RepoService().guardar(this);
  }
}
