import '../models/models.dart';

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

class CorteCaja {
  String? id;
  DateTime? fechaApertura;
  DateTime? fechaCorte;
  int? idUsuario;
  double? fondo;
  int? idSucursal;
  double? fondoDiaSig;
  double? ventaPuntos;
  double? ventaEfe;
  double? ventaTrans;
  double? ventaTarj;
  double? gasto;
  double? retiro;
  double? deposito;
  double? corteFinal;
  DateTime? creado;
  DateTime? eliminado;
  DateTime? modificado;
  String? idWeb;
  String? sincronizado;

  List<Deposito> depositos = [];
  List<Retiro> retiros = [];
  List<Gasto> gastos = [];

  CorteCaja({
    this.id,
    this.fechaApertura,
    this.fechaCorte,
    this.idUsuario,
    this.idSucursal,
    this.fondo,
    this.fondoDiaSig,
    this.ventaPuntos,
    this.ventaEfe,
    this.ventaTrans,
    this.ventaTarj,
    this.gasto,
    this.retiro,
    this.deposito,
    this.corteFinal,
    this.creado,
    this.modificado,
    this.eliminado,
    this.idWeb,
    this.sincronizado,
    this.depositos = const [],
    this.retiros = const [],
    this.gastos = const [],
  });

  Map<String, dynamic> toJson() {
    return {
      'id': id,
      'fechaApertura': fechaApertura?.toIso8601String(),
      'fechaCorte': fechaCorte?.toIso8601String(),
      'idUsuario': idUsuario ?? 0,
      'idSucursal': idSucursal ?? 0,
      'fondo': fondo ?? 0.0,
      'fondoDiaSig': fondoDiaSig ?? 0.0,
      'ventaPuntos': ventaPuntos ?? 0.0,
      'ventaEfe': ventaEfe ?? 0.0,
      'ventaTrans': ventaTrans ?? 0.0,
      'ventaTarj': ventaTarj ?? 0.0,
      'gasto': gasto ?? 0.0,
      'retiro': retiro ?? 0.0,
      'deposito': deposito ?? 0.0,
      'corteFinal': corteFinal ?? 0.0,
      'creado': creado?.toIso8601String(),
      'modificado': modificado?.toIso8601String(),
      'eliminado': eliminado?.toIso8601String(),
      'sincronizado': sincronizado,
      'idWeb': idWeb,
    };
  }

  Map<String, dynamic> toApi() {
    return {
      'id': id,
      'fechaApertura': fechaApertura,
      'fechaCorte': fechaCorte,
      'idUsuario': idUsuario,
      'idSucursal': idSucursal,
      'fondo': fondo,
      'fondoDiaSig': fondoDiaSig,
      'ventaPuntos': ventaPuntos,
      'ventaEfe': ventaEfe,
      'ventaTrans': ventaTrans,
      'ventaTarj': ventaTarj,
      'gasto': gasto,
      'retiro': retiro,
      'deposito': deposito,
      'corteFinal': corteFinal,
      'creado': creado,
      'modificado': modificado,
      'eliminado': eliminado,
      'depositos': depositos.map((d) => d.toApi()).toList(),
      'retiros': retiros.map((r) => r.toApi()).toList(),
      'gastos': gastos.map((g) => g.toApi()).toList(),
    };
  }

  CorteCaja.fromJson(Map<String, dynamic> json) {
    id = Basico.parseString(json['id']);
    fechaApertura = Basico.parseDate(json['fechaApertura']);
    fechaCorte = Basico.parseDate(json['fechaCorte']);
    idUsuario = Basico.parseInt(json['idUsuario']);
    idSucursal = Basico.parseInt(json['idSucursal']);
    fondo = Basico.parseDouble(json['fondo']);
    fondoDiaSig = Basico.parseDouble(json['fondoDiaSig']);
    ventaPuntos = Basico.parseDouble(json['ventaPuntos']);
    ventaEfe = Basico.parseDouble(json['ventaEfe']);
    ventaTrans = Basico.parseDouble(json['ventaTrans']);
    ventaTarj = Basico.parseDouble(json['ventaTarj']);
    gasto = Basico.parseDouble(json['gasto']);
    retiro = Basico.parseDouble(json['retiro']);
    deposito = Basico.parseDouble(json['deposito']);
    corteFinal = Basico.parseDouble(json['corteFinal']);
    creado = Basico.parseDate(json['creado']);
    eliminado = Basico.parseDate(json['eliminado']);
    modificado = Basico.parseDate(json['modificado']);
    idWeb = Basico.parseString(json['idWeb']);
    sincronizado = Basico.parseString(json['sincronizado']);
  }

  Future<void> guardar() async {
    await DatabaseService().guardar(this);
  }
}
