import 'dart:typed_data';

import 'package:flutter/cupertino.dart';
import 'package:fluttertoast/fluttertoast.dart';
import 'package:test_sa/extensions/context_extension.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';
import 'package:test_sa/models/timer_model.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.extensionNo,
      this.employeeId,
      this.name,
      this.createdDate,
      this.site,
      this.building,
      this.floor,
      this.department,
      this.assignedEmployee,
      this.status,
      this.comment,
      this.gazRefillDetails,
      this.localEngineerSignature,
      this.localNurseSignature,
      this.timer});

  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'];
    comment = json['comment'];
    workingHours = json['workingHours'];
    extensionNo = json['extensionNo'];
    employeeId = json['employeeId'];
    name = json['name'];
    createdDate = json['createdDate'];
    try {
      final DateTime? sd = DateTime.tryParse(startDate ?? "");
      final DateTime? st = DateTime.tryParse(startTime ?? "");
      final DateTime? ed = DateTime.tryParse(endDate ?? "");
      final DateTime? et = DateTime.tryParse(endTime ?? "");
      timer = TimerModel(
        startAt: st == null ? sd : sd?.add(Duration(hours: st.hour, minutes: st.minute, seconds: st.second)), // Handle potential null 'sd'
        endAt: et == null ? ed : ed?.add(Duration(hours: et.hour, minutes: et.minute, seconds: et.second)), // Handle potential null 'ed'
      );
      if (timer!.endAt != null && timer!.startAt != null) {
        // Use '!' since timer could be null after initialization
        timer!.durationInSecond = (timer!.endAt!.difference(timer!.startAt!)).inSeconds;
        workingHours = (((timer!.durationInSecond ?? 0) / 60) / 60);
      }
    } catch (e) {
      print(e);
    }
    engSignature = json['engSignature'];
    nurseSignature = json['nurseSignature'];
    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;
    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)); // Use '!' since gazRefillDetails is initialized here
      });
    }
  }

  num? id; // Now nullable
  String? gazRefillNo; // Now nullable
  String? expectedDate; // Now nullable
  String? expectedTime; // Now nullable
  String? startDate; // Now nullable
  String? startTime; // Now nullable
  String? endDate; // Now nullable
  String? endTime; // Now nullable
  String? engSignature; // Now nullable
  String? nurseSignature; // Now nullable
  num? workingHours;
  dynamic extensionNo;
  String? employeeId;
  String? name;
  String? createdDate;
  Site? site; // Now nullable
  Building? building; // Now nullable
  Floor? floor; // Now nullable
  Department? department; // Now nullable
  AssignedEmployee? assignedEmployee; // Now nullable
  Lookup? status; // Now nullable
  String? comment; // Now nullable
  List<GasRefillDetails>? gazRefillDetails; // Now nullable
  Uint8List? localNurseSignature; // Now nullable
  Uint8List? localEngineerSignature; // Now nullable
  TimerModel? timer; // Now nullable

  GasRefillModel copyWith({
    num? id, // Parameters are now nullable
    String? gazRefillNo,
    String? expectedDate,
    String? expectedTime,
    String? startDate,
    String? startTime,
    String? endDate,
    String? endTime,
    String? engSignature,
    String? nurseSignature,
    num? workingHours,
    num? extensionNo,
    num? employeeId,
    String? name,
    String? createdDate,
    Site? site,
    Building? building,
    Floor? floor,
    Department? department,
    AssignedEmployee? assignedEmployee,
    Lookup? status,
    String? comment,
    List<GasRefillDetails>? gazRefillDetails,
    TimerModel? timer,
  }) =>
      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,
        comment: comment ?? this.comment,
        gazRefillDetails: gazRefillDetails ?? this.gazRefillDetails,
        timer: timer ?? this.timer,
      );

  Map<String, dynamic> toJson() {
    final map = <String, dynamic>{};
    map['id'] = id ?? 0;
    map['gazRefillNo'] = "GR-${DateTime.now().toString().split(" ").first}";
    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;
    map['extensionNo'] = extensionNo;
    map['employeeId'] = employeeId;
    map['name'] = name;
    map['createdDate'] = createdDate;
    map['comment'] = comment;
    if (site != null) {
      map['site'] = site?.toJson(addBuildings: false); // Use '?.' for null safety
    }
    if (building != null) {
      map['building'] = building?.toJson(addFloor: false); // Use '?.' for null safety
    }
    if (floor != null) {
      map['floor'] = floor?.toJson(addDepartments: false); // Use '?.' for null safety
    }
    if (department != null) {
      map['department'] = department?.toJson(); // Use '?.' for null safety
    }
    if (assignedEmployee != null) {
      map['assignedEmployee'] = assignedEmployee?.toJson(); // Use '?.' for null safety
    }
    if (status != null) {
      map['status'] = status?.toJson(); // Use '?.' for null safety
    }
    if (gazRefillDetails != null) {
      map['gazRefillDetails'] = gazRefillDetails!.map((v) => v.toJson()).toList(); // Use '!' since gazRefillDetails could be null
    }
    return map;
  }

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

  fromGasRefillModel(GasRefillModel model) {
    id = model.id;
    //userId = model.userId;
    site = model.site;
    gazRefillNo = model.gazRefillNo;
    status = Lookup.fromStatus(model.status);
    gazRefillDetails = model.gazRefillDetails;
    building = model.building;
    floor = model.floor;
    department = model.department;
    startDate = model.startDate;
    endDate = model.endDate;
    expectedDate = model.expectedDate;
    comment = model.comment;
    assignedEmployee = model.assignedEmployee;
    localEngineerSignature = model.localEngineerSignature;
    localNurseSignature = model.localNurseSignature;
    engSignature = model.engSignature;
    nurseSignature = model.nurseSignature;
    workingHours = model.workingHours;
    extensionNo = model.extensionNo;
    employeeId = model.employeeId;
    name = model.name;
    createdDate = model.createdDate;
  }
}

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

  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; // Now nullable
  Lookup? gasType; // Now nullable
  Lookup? cylinderType; // Now nullable
  Lookup? cylinderSize; // Now nullable
  num? requestedQty; // Now nullable
  num? deliverdQty; // Now nullable
  bool? selectedForEditing; // Now nullable

  GasRefillDetails copyWith({
    num? id, // Parameters are now nullable
    Lookup? gasType,
    Lookup? cylinderType,
    Lookup? cylinderSize,
    num? requestedQty,
    num? deliverdQty,
    bool? selectedForEditing,
  }) =>
      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,
        selectedForEditing: selectedForEditing ?? this.selectedForEditing,
      );

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

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