import 'package:hive/hive.dart';

part 'user_sector_model.g.dart';

/// Modèle pour stocker les associations entre utilisateurs et secteurs
///
/// Cette classe représente l'association entre un utilisateur et un secteur,
/// telle que reçue de l'API dans la réponse users_sectors.
///
/// ⚠️ IMPORTANT : Distinction des IDs
/// - userId : ID de la table centrale `users` (pour gestion des membres)
/// - opeUserId : ID de la table `ope_users` (pour lier avec passages/sectors)
@HiveType(typeId: 6)
class UserSectorModel extends HiveObject {
  @HiveField(0)
  final int userId; // ID de l'utilisateur (table centrale users)

  @HiveField(1)
  final String? firstName;

  @HiveField(2)
  final String? sectName;

  @HiveField(3)
  final int fkSector; // ID du secteur

  @HiveField(4)
  final String? name;

  @HiveField(5)
  final int opeUserId; // ID de l'utilisateur dans ope_users (pour lier avec passages)

  UserSectorModel({
    required this.userId,
    this.firstName,
    this.sectName,
    required this.fkSector,
    this.name,
    required this.opeUserId,
  });

  /// Crée un modèle UserSectorModel à partir d'un objet JSON
  factory UserSectorModel.fromJson(Map<String, dynamic> json) {
    return UserSectorModel(
      userId: json['user_id'] is String ? int.parse(json['user_id']) : json['user_id'],
      opeUserId: json['ope_user_id'] is String ? int.parse(json['ope_user_id']) : json['ope_user_id'],
      firstName: json['first_name'],
      sectName: json['sect_name'],
      fkSector: json['fk_sector'] is String ? int.parse(json['fk_sector']) : json['fk_sector'],
      name: json['name'],
    );
  }

  /// Convertit le modèle en objet JSON
  Map<String, dynamic> toJson() {
    return {
      'user_id': userId,
      'ope_user_id': opeUserId,
      'first_name': firstName,
      'sect_name': sectName,
      'fk_sector': fkSector,
      'name': name,
    };
  }

  /// Crée une copie du modèle avec des valeurs potentiellement modifiées
  UserSectorModel copyWith({
    int? userId,
    int? opeUserId,
    String? firstName,
    String? sectName,
    int? fkSector,
    String? name,
  }) {
    return UserSectorModel(
      userId: userId ?? this.userId,
      opeUserId: opeUserId ?? this.opeUserId,
      firstName: firstName ?? this.firstName,
      sectName: sectName ?? this.sectName,
      fkSector: fkSector ?? this.fkSector,
      name: name ?? this.name,
    );
  }

  @override
  String toString() {
    return 'UserSectorModel(userId: $userId, opeUserId: $opeUserId, firstName: $firstName, sectName: $sectName, fkSector: $fkSector, name: $name)';
  }
}
