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;
  int departmentId;
  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;
  bool phoneNumberConfirmed;
  bool twoFactorEnabled;
  dynamic lockoutEnd;
  bool lockoutEnabled;
  int accessFailedCount;

  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,
  });

  Future<Map<String, dynamic>> toLoginJson() async {
    if (FirebaseNotificationManger.token == null) await FirebaseNotificationManger.getToken();
    return {
      "username": userName,
      "password": password,
      "fireBaseToken": FirebaseNotificationManger?.token ?? "",
    };
  }

  UsersTypes get type {
    switch (userRoles?.first?.name) {
      case "Engineer":
        return UsersTypes.engineer;
      case "Hospital":
        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();
    }
    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['phoneNumberConfirmed'] = phoneNumberConfirmed;
    map['twoFactorEnabled'] = twoFactorEnabled;
    map['lockoutEnd'] = lockoutEnd;
    map['lockoutEnabled'] = lockoutEnabled;
    map['accessFailedCount'] = accessFailedCount;
    return map;
  }

  User.fromJson(dynamic json) {
    clientId = json['client_id'];
    clientName = json['client_name'];
    departmentId = json['department_id'];
    departmentName = json['department_name'];
    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));
      });
    }
    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'];
    phoneNumberConfirmed = json['phoneNumberConfirmed'];
    twoFactorEnabled = json['twoFactorEnabled'];
    lockoutEnd = json['lockoutEnd'];
    lockoutEnabled = json['lockoutEnabled'];
    accessFailedCount = json['accessFailedCount'];
  }
}

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

  UserRoles.fromJson(dynamic json) {
    id = json['id'];
    name = json['name'];
    value = json['value'];
  }
  String id;
  String name;
  String 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;
  }
}
