import 'dart:io';

import 'package:flutter/foundation.dart';
import 'package:test_sa/controllers/notification/firebase_notification_manger.dart';
import 'package:test_sa/models/enums/user_types.dart';

class User {
  int? clientId;
  String? clientName;
  List<int>? departmentId;
  List<String>? departmentName;
  String? message;

  String? username;
  String? userID;
  String? email;
  String? password;
  String? token;
  dynamic roles;
  List<UserRoles>? userRoles;
  String? tokenlife;
  bool? isAuthenticated;
  bool? hasError;
  String? profilePhotoName;
  String? id;
  String? userName;
  String? normalizedUserName;
  String? normalizedEmail;
  bool? emailConfirmed;
  dynamic passwordHash;
  String? securityStamp;
  String? concurrencyStamp;
  String? phoneNumber;
  String? extensionNo;
  bool? phoneNumberConfirmed;
  bool? twoFactorEnabled;
  dynamic lockoutEnd;
  bool? lockoutEnabled;
  int? accessFailedCount;
  List<AssetGroup>? assetGroups;
  bool? employeeIsHMG;
  bool? enableWifi;
  bool? enableNFC;
  bool? enableQR;
  bool? onlySwipe;

  User({
    this.clientId,
    this.clientName,
    this.departmentId,
    this.departmentName,
    this.message,
    this.username,
    this.userID,
    this.email,
    this.password,
    this.token,
    this.roles,
    this.userRoles,
    this.tokenlife,
    this.isAuthenticated,
    this.hasError,
    this.profilePhotoName,
    this.id,
    this.userName,
    this.normalizedUserName,
    this.normalizedEmail,
    this.emailConfirmed,
    this.passwordHash,
    this.securityStamp,
    this.concurrencyStamp,
    this.phoneNumber,
    this.phoneNumberConfirmed,
    this.twoFactorEnabled,
    this.lockoutEnd,
    this.lockoutEnabled,
    this.accessFailedCount,
    this.employeeIsHMG,
    this.enableNFC,
    this.enableQR,
    this.enableWifi,
    this.onlySwipe,
  });

  bool get isLiveToken => tokenlife != null && (DateTime.tryParse(tokenlife!)?.isAfter(DateTime.now()) ?? false);

  Future<Map<String, dynamic>> toLoginJson() async {
    String notificationType = (Platform.isAndroid && !(await FirebaseNotificationManger.isGoogleServicesAvailable())) ? "HMC" : "FCM";
    return {"username": userName, "password": password, "fireBaseToken": FirebaseNotificationManger?.token ?? "", "notificationType": notificationType};
  }

  UsersTypes? get type {
    switch (userRoles?.first.value) {
      case "R-6":
        return UsersTypes.engineer;
      case "R-7": // Nurse Role
        return UsersTypes.normal_user;
      case "R-33": // Head Nurse Role
        return UsersTypes.normal_user;
      default:
        return null;
    }
  }

  Map<String, dynamic> toUpdateProfileJson() {
    Map<String, dynamic> jsonObject = {};
    // if (departmentId != null) jsonObject["department"] = departmentId;
    // if (whatsApp != null && whatsApp.isNotEmpty) jsonObject["whatsapp"] = whatsApp;
    // if (phoneNumber != null && phoneNumber.isNotEmpty) jsonObject["phone"] = phoneNumber;
    return jsonObject;
  }

  Future<Map<String, dynamic>> toRegisterJson() async {
    // if (FirebaseNotificationManger.token == null) await FirebaseNotificationManger.getToken();
    return {
      // "username": userName,
      // "email": email,
      // "whatsapp": whatsApp,
      // "client": hospital.id,
      // "department": department?.id,
      // "phone": phoneNumber,
      // "pass": password,
      // "firebase_token": FirebaseNotificationManger?.token ?? "",
    };
  }

  Map<String, dynamic> toJson() {
    final map = <String, dynamic>{};
    map['client_id'] = clientId;
    map['client_name'] = clientName;
    map['department_id'] = departmentId;
    map['department_name'] = departmentName;
    map['message'] = message;
    map['username'] = username;
    map['userID'] = userID;
    map['email'] = email;
    map['password'] = password;
    map['token'] = token;
    map['roles'] = roles;
    if (userRoles != null) {
      map['userRoles'] = userRoles!.map((v) => v.toJson()).toList();
    }
    if (assetGroups != null) {
      map['assetGroups'] = assetGroups!.map((v) => v.toJson()).toList();
    }
    map['tokenlife'] = tokenlife;
    map['isAuthenticated'] = isAuthenticated;
    map['hasError'] = hasError;
    map['profilePhotoName'] = profilePhotoName;
    map['id'] = id;
    map['userName'] = userName;
    map['normalizedUserName'] = normalizedUserName;
    map['normalizedEmail'] = normalizedEmail;
    map['emailConfirmed'] = emailConfirmed;
    map['passwordHash'] = passwordHash;
    map['securityStamp'] = securityStamp;
    map['concurrencyStamp'] = concurrencyStamp;
    map['phoneNumber'] = phoneNumber;
    map['extensionNo'] = extensionNo;
    map['phoneNumberConfirmed'] = phoneNumberConfirmed;
    map['twoFactorEnabled'] = twoFactorEnabled;
    map['lockoutEnd'] = lockoutEnd;
    map['lockoutEnabled'] = lockoutEnabled;
    map['accessFailedCount'] = accessFailedCount;
    map['employeeIsHMG'] = employeeIsHMG;
    map['enableWifi'] = enableWifi;
    map['enableNFC'] = enableNFC;
    map['enableQR'] = enableQR;
    map['onlySwipe'] = onlySwipe;
    return map;
  }

  static Future<User> fromJson(Map<String, dynamic> json) {
    return compute(User.fromJsonCons, json);
  }

  User.fromJsonCons(dynamic json) {
    clientId = json['client_id'];
    clientName = json['client_name'];
    if (json['department_id'] != null) {
      departmentId = [];
      json['department_id'].forEach((v) {
        departmentId!.add(v);
      });
    }
    if (json['department_name'] != null) {
      departmentName = [];
      json['department_name'].forEach((v) {
        departmentName!.add(v);
      });
    }
    message = json['message'];
    username = json['username'];
    userID = json['userID'];
    email = json['email'];
    password = json['password'];
    token = json['token'];
    roles = json['roles'];
    if (json['userRoles'] != null) {
      userRoles = [];
      json['userRoles'].forEach((v) {
        userRoles!.add(UserRoles.fromJson(v));
      });
    }

    if (json['assetGroups'] != null) {
      assetGroups = <AssetGroup>[];
      json['assetGroups'].forEach((v) {
        assetGroups!.add(AssetGroup.fromJson(v));
      });
    }
    tokenlife = json['tokenlife'];
    isAuthenticated = json['isAuthenticated'];
    hasError = json['hasError'];
    profilePhotoName = json['profilePhotoName'];
    id = json['id'];
    userName = json['userName'];
    normalizedUserName = json['normalizedUserName'];
    normalizedEmail = json['normalizedEmail'];
    emailConfirmed = json['emailConfirmed'];
    passwordHash = json['passwordHash'];
    securityStamp = json['securityStamp'];
    concurrencyStamp = json['concurrencyStamp'];
    phoneNumber = json['phoneNumber'];
    extensionNo = json['extensionNo'];
    phoneNumberConfirmed = json['phoneNumberConfirmed'];
    twoFactorEnabled = json['twoFactorEnabled'];
    lockoutEnd = json['lockoutEnd'];
    lockoutEnabled = json['lockoutEnabled'];
    accessFailedCount = json['accessFailedCount'];
    employeeIsHMG = json['employeeIsHMG'];
    enableWifi = json['enableWifi'];
    enableNFC = json['enableNFC'];
    enableQR = json['enableQR'];
    onlySwipe = json['onlySwipe'];
  }
}

class UserRoles {
  String? id;
  String? name;
  String? value;

  UserRoles({
    this.id,
    this.name,
    this.value,
  });

  UserRoles.fromJson(dynamic json) {
    id = json['id'];
    name = json['name'];
    value = json['value'];
  }

  UserRoles copyWith({
    String? id,
    String? name,
    String? value,
  }) =>
      UserRoles(
        id: id ?? this.id,
        name: name ?? this.name,
        value: value ?? this.value,
      );

  Map<String, dynamic> toJson() {
    final map = <String, dynamic>{};
    map['id'] = id;
    map['name'] = name;
    map['value'] = value;
    return map;
  }
}

class AssetGroup {
  int? id;
  String? name;
  String? code;
  bool? enabledEngineerTimer;

  AssetGroup({this.id, this.name, this.code, this.enabledEngineerTimer});

  AssetGroup.fromJson(Map<String, dynamic>? json) {
    // Allow json to be null
    if (json != null) {
      // Add null check
      id = json['id'];
      name = json['name'];
      code = json['code'];
      enabledEngineerTimer = json['enabledEngineerTimer'] ?? false;
    }
  }

  Map<String, dynamic> toJson() {
    final Map<String, dynamic> data = <String, dynamic>{}; // Use <String, dynamic> for type safety
    data['id'] = id;
    data['name'] = name;
    data['code'] = code;
    data['enabledEngineerTimer'] = enabledEngineerTimer;
    return data;
  }
}

class UserContactInfoModel {
  dynamic userId;
  String? email;
  String? phoneNo;
  String? extensionNo;

  UserContactInfoModel({this.email, this.phoneNo, this.extensionNo, this.userId});

  Map<String, dynamic> toJson() {
    return {
      'email': email,
      'mobileNumber': phoneNo,
      'extensionNo': extensionNo,
    };
  }
}
