import 'package:hive/hive.dart';
import 'package:equatable/equatable.dart';

part 'anonymous_user_model.g.dart';

/// Modèle d'utilisateur anonyme pour le système de chat
///
/// Ce modèle représente un utilisateur anonyme (pour le cas Resalice)
/// et permet de tracker sa conversion éventuelle en utilisateur authentifié

@HiveType(typeId: 24)
class AnonymousUserModel extends HiveObject with EquatableMixin {
  @HiveField(0)
  final String id;

  @HiveField(1)
  final String deviceId;

  @HiveField(2)
  final String? name;

  @HiveField(3)
  final String? email;

  @HiveField(4)
  final DateTime createdAt;

  @HiveField(5)
  final String? convertedToUserId;

  @HiveField(6)
  final Map<String, dynamic>? metadata;

  AnonymousUserModel({
    required this.id,
    required this.deviceId,
    this.name,
    this.email,
    required this.createdAt,
    this.convertedToUserId,
    this.metadata,
  });

  /// Crée une instance depuis le JSON
  factory AnonymousUserModel.fromJson(Map<String, dynamic> json) {
    return AnonymousUserModel(
      id: json['id'] as String,
      deviceId: json['device_id'] as String,
      name: json['name'] as String?,
      email: json['email'] as String?,
      createdAt: DateTime.parse(json['created_at'] as String),
      convertedToUserId: json['converted_to_user_id'] as String?,
      metadata: json['metadata'] as Map<String, dynamic>?,
    );
  }

  /// Convertit l'instance en JSON
  Map<String, dynamic> toJson() {
    return {
      'id': id,
      'device_id': deviceId,
      'name': name,
      'email': email,
      'created_at': createdAt.toIso8601String(),
      'converted_to_user_id': convertedToUserId,
      'metadata': metadata,
    };
  }

  /// Crée une copie modifiée de l'instance
  AnonymousUserModel copyWith({
    String? id,
    String? deviceId,
    String? name,
    String? email,
    DateTime? createdAt,
    String? convertedToUserId,
    Map<String, dynamic>? metadata,
  }) {
    return AnonymousUserModel(
      id: id ?? this.id,
      deviceId: deviceId ?? this.deviceId,
      name: name ?? this.name,
      email: email ?? this.email,
      createdAt: createdAt ?? this.createdAt,
      convertedToUserId: convertedToUserId ?? this.convertedToUserId,
      metadata: metadata ?? this.metadata,
    );
  }

  /// Vérifie si l'utilisateur a été converti en utilisateur authentifié
  bool get isConverted => convertedToUserId != null;

  @override
  List<Object?> get props => [
        id,
        deviceId,
        name,
        email,
        createdAt,
        convertedToUserId,
        metadata,
      ];
}
