import 'package:hive/hive.dart';

part 'membre_model.g.dart';

@HiveType(typeId: 5) // Utilisation d'un typeId unique
class MembreModel extends HiveObject {
  @HiveField(0)
  final int id;

  @HiveField(1)
  final int fkRole;

  @HiveField(2)
  final int fkTitre;

  @HiveField(3)
  final String firstName;

  @HiveField(4)
  final String? sectName;

  @HiveField(5)
  final DateTime? dateNaissance;

  @HiveField(6)
  final DateTime? dateEmbauche;

  @HiveField(7)
  final int chkActive;

  @HiveField(8)
  final String name;

  @HiveField(9)
  final String username;

  @HiveField(10)
  final String email;

  MembreModel({
    required this.id,
    required this.fkRole,
    required this.fkTitre,
    required this.firstName,
    this.sectName,
    this.dateNaissance,
    this.dateEmbauche,
    required this.chkActive,
    required this.name,
    required this.username,
    required this.email,
  });

  // Factory pour convertir depuis JSON (API)
  factory MembreModel.fromJson(Map<String, dynamic> json) {
    // Convertir l'ID en int, qu'il soit déjà int ou string
    final dynamic rawId = json['id'];
    final int id = rawId is String ? int.parse(rawId) : rawId as int;

    // Convertir le rôle en int, qu'il soit déjà int ou string
    final dynamic rawRole = json['fk_role'];
    final int fkRole = rawRole is String ? int.parse(rawRole) : rawRole as int;

    // Convertir le titre en int, qu'il soit déjà int ou string
    final dynamic rawTitre = json['fk_titre'];
    final int fkTitre =
        rawTitre is String ? int.parse(rawTitre) : rawTitre as int;

    // Convertir le chkActive en int, qu'il soit déjà int ou string
    final dynamic rawActive = json['chk_active'];
    final int chkActive =
        rawActive is String ? int.parse(rawActive) : rawActive as int;

    return MembreModel(
      id: id,
      fkRole: fkRole,
      fkTitre: fkTitre,
      firstName: json['first_name'] ?? '',
      sectName: json['sect_name'],
      dateNaissance: json['date_naissance'] != null
          ? DateTime.parse(json['date_naissance'])
          : null,
      dateEmbauche: json['date_embauche'] != null
          ? DateTime.parse(json['date_embauche'])
          : null,
      chkActive: chkActive,
      name: json['name'] ?? '',
      username: json['username'] ?? '',
      email: json['email'] ?? '',
    );
  }

  // Convertir en JSON pour l'API
  Map<String, dynamic> toJson() {
    return {
      'id': id,
      'fk_role': fkRole,
      'fk_titre': fkTitre,
      'first_name': firstName,
      'sect_name': sectName,
      'date_naissance': dateNaissance?.toIso8601String(),
      'date_embauche': dateEmbauche?.toIso8601String(),
      'chk_active': chkActive,
      'name': name,
      'username': username,
      'email': email,
    };
  }

  // Copier avec de nouvelles valeurs
  MembreModel copyWith({
    int? fkRole,
    int? fkTitre,
    String? firstName,
    String? sectName,
    DateTime? dateNaissance,
    DateTime? dateEmbauche,
    int? chkActive,
    String? name,
    String? username,
    String? email,
  }) {
    return MembreModel(
      id: this.id,
      fkRole: fkRole ?? this.fkRole,
      fkTitre: fkTitre ?? this.fkTitre,
      firstName: firstName ?? this.firstName,
      sectName: sectName ?? this.sectName,
      dateNaissance: dateNaissance ?? this.dateNaissance,
      dateEmbauche: dateEmbauche ?? this.dateEmbauche,
      chkActive: chkActive ?? this.chkActive,
      name: name ?? this.name,
      username: username ?? this.username,
      email: email ?? this.email,
    );
  }
}
