import 'dart:developer';

import 'package:flutter/cupertino.dart';
import 'package:fluttertoast/fluttertoast.dart';
import 'package:test_sa/extensions/context_extension.dart';
import 'package:test_sa/models/enums/translation_keys.dart';
import 'package:test_sa/models/lookup.dart';
import 'package:test_sa/models/new_models/assigned_employee.dart';
import 'package:test_sa/models/new_models/building.dart';
import 'package:test_sa/models/new_models/department.dart';
import 'package:test_sa/models/new_models/floor.dart';
import 'package:test_sa/models/new_models/site.dart';

class GasRefillModel {
  GasRefillModel({
    this.id,
    this.gazRefillNo,
    this.expectedDate,
    this.expectedTime,
    this.startDate,
    this.startTime,
    this.endDate,
    this.endTime,
    this.engSignature,
    this.nurseSignature,
    this.workingHours,
    this.site,
    this.building,
    this.floor,
    this.department,
    this.assignedEmployee,
    this.status,
    this.gazRefillDetails,
  });

  GasRefillModel.fromJson(dynamic json) {
    id = json['id'];
    gazRefillNo = json['gazRefillNo'];
    expectedDate = json['expectedDate'];
    expectedTime = json['expectedTime'];
    startDate = json['startDate'];
    startTime = json['startTime'];
    endDate = json['endDate'];
    endTime = json['endTime'];
    engSignature = json['engSignature'];
    nurseSignature = json['nurseSignature'];
    workingHours = json['workingHours'];
    site = json['site'] != null ? Site.fromJson(json['site']) : null;
    building = json['building'] != null ? Building.fromJson(json['building']) : null;
    floor = json['floor'] != null ? Floor.fromJson(json['floor']) : null;
    log(json['department']);
    department = json['department'] != null ? Department.fromJson(json['department']) : null;
    assignedEmployee = json['assignedEmployee'] != null ? AssignedEmployee.fromJson(json['assignedEmployee']) : null;
    status = json['status'] != null ? Lookup.fromJson(json['status']) : null;
    if (json['gazRefillDetails'] != null) {
      gazRefillDetails = [];
      json['gazRefillDetails'].forEach((v) {
        gazRefillDetails.add(GasRefillDetails.fromJson(v));
      });
    }
  }

  num id;
  String gazRefillNo;
  String expectedDate;
  String expectedTime;
  String startDate;
  String startTime;
  String endDate;
  String endTime;
  String engSignature;
  String nurseSignature;
  num workingHours;
  Site site;
  Building building;
  Floor floor;
  Department department;
  AssignedEmployee assignedEmployee;
  Lookup status;
  List<GasRefillDetails> gazRefillDetails;

  GasRefillModel copyWith({
    num id,
    String gazRefillNo,
    String expectedDate,
    String expectedTime,
    String startDate,
    String startTime,
    String endDate,
    String endTime,
    String engSignature,
    String nurseSignature,
    num workingHours,
    Site site,
    Building building,
    Floor floor,
    Department department,
    AssignedEmployee assignedEmployee,
    Lookup status,
    List<GasRefillDetails> gazRefillDetails,
  }) =>
      GasRefillModel(
        id: id ?? this.id,
        gazRefillNo: gazRefillNo ?? this.gazRefillNo,
        expectedDate: expectedDate ?? this.expectedDate,
        expectedTime: expectedTime ?? this.expectedTime,
        startDate: startDate ?? this.startDate,
        startTime: startTime ?? this.startTime,
        endDate: endDate ?? this.endDate,
        endTime: endTime ?? this.endTime,
        engSignature: engSignature ?? this.engSignature,
        nurseSignature: nurseSignature ?? this.nurseSignature,
        workingHours: workingHours ?? this.workingHours,
        site: site ?? this.site,
        building: building ?? this.building,
        floor: floor ?? this.floor,
        department: department ?? this.department,
        assignedEmployee: assignedEmployee ?? this.assignedEmployee,
        status: status ?? this.status,
        gazRefillDetails: gazRefillDetails ?? this.gazRefillDetails,
      );

  Map<String, dynamic> toJson() {
    final map = <String, dynamic>{};
    map['id'] = id;
    map['gazRefillNo'] = gazRefillNo;
    map['expectedDate'] = expectedDate;
    map['expectedTime'] = expectedTime;
    map['startDate'] = startDate;
    map['startTime'] = startTime;
    map['endDate'] = endDate;
    map['endTime'] = endTime;
    map['engSignature'] = engSignature;
    map['nurseSignature'] = nurseSignature;
    map['workingHours'] = workingHours;
    if (site != null) {
      map['site'] = site.toJson();
    }
    if (building != null) {
      map['building'] = building.toJson();
    }
    if (floor != null) {
      map['floor'] = floor.toJson();
    }
    if (department != null) {
      map['department'] = department.toJson();
    }
    if (assignedEmployee != null) {
      map['assignedEmployee'] = assignedEmployee.toJson();
    }
    if (status != null) {
      map['status'] = status.toMap();
    }
    if (gazRefillDetails != null) {
      map['gazRefillDetails'] = gazRefillDetails.map((v) => v.toJson()).toList();
    }
    return map;
  }

  Future<bool> validate(BuildContext context) async {
    if (site == null) {
      await Fluttertoast.showToast(msg: "${context.translation.youHaveToSelect} ${context.translation.destinationSite}");
      return false;
    } else if (building == null) {
      await Fluttertoast.showToast(msg: "${context.translation.youHaveToSelect} ${context.translation.building}");
      return false;
    } else if (floor == null) {
      await Fluttertoast.showToast(msg: "${context.translation.youHaveToSelect} ${context.translation.floor}");
      return false;
    } else if (department == null) {
      await Fluttertoast.showToast(msg: "${context.translation.youHaveToSelect} ${context.translation.department}");
      return false;
    }
    return true;
  }
}

class GasRefillDetails {
  GasRefillDetails({
    this.id,
    this.gasType,
    this.cylinderType,
    this.cylinderSize,
    this.requestedQty,
    this.deliverdQty,
  });

  GasRefillDetails.fromJson(dynamic json) {
    id = json['id'];
    gasType = json['gasType'] != null ? Lookup.fromJson(json['gasType']) : null;
    cylinderType = json['cylinderType'] != null ? Lookup.fromJson(json['cylinderType']) : null;
    cylinderSize = json['cylinderSize'] != null ? Lookup.fromJson(json['cylinderSize']) : null;
    requestedQty = json['requestedQty'];
    deliverdQty = json['deliverdQty'];
  }

  num id;
  Lookup gasType;
  Lookup cylinderType;
  Lookup cylinderSize;
  num requestedQty;
  num deliverdQty;

  GasRefillDetails copyWith({
    num id,
    Lookup gasType,
    Lookup cylinderType,
    Lookup cylinderSize,
    num requestedQty,
    num deliverdQty,
  }) =>
      GasRefillDetails(
        id: id ?? this.id,
        gasType: gasType ?? this.gasType,
        cylinderType: cylinderType ?? this.cylinderType,
        cylinderSize: cylinderSize ?? this.cylinderSize,
        requestedQty: requestedQty ?? this.requestedQty,
        deliverdQty: deliverdQty ?? this.deliverdQty,
      );

  Map<String, dynamic> toJson() {
    final map = <String, dynamic>{};
    map['id'] = id;
    if (gasType != null) {
      map['gasType'] = gasType.toMap();
    }
    if (cylinderType != null) {
      map['cylinderType'] = cylinderType.toMap();
    }
    if (cylinderSize != null) {
      map['cylinderSize'] = cylinderSize.toMap();
    }
    map['requestedQty'] = requestedQty;
    map['deliverdQty'] = deliverdQty;
    return map;
  }

  Future<bool> validate(BuildContext context) async {
    if (gasType == null) {
      await Fluttertoast.showToast(msg: "${context.translation.youHaveToSelect} ${context.translation.gasType}");
      return false;
    } else if (cylinderType == null) {
      await Fluttertoast.showToast(msg: "${context.translation.youHaveToSelect} ${context.translation.cylinderType}");
      return false;
    } else if (cylinderSize == null) {
      await Fluttertoast.showToast(msg: "${context.translation.youHaveToSelect} ${context.translation.cylinderSize}");
      return false;
    }
    return true;
  }
}
