import 'package:equatable/equatable.dart';

/// Abstract base class for all user-related states.
///
/// This class extends [Equatable] to enable value equality for state comparison.
/// All user states in the application should inherit from this class.
abstract class UserState extends Equatable {
  @override
  List<Object?> get props => [];
}

/// Initial state of the user bloc.
///
/// This state represents the initial state before any user operations
/// have been performed or when the user has logged out.
class UserInitial extends UserState {}

/// State indicating that a user operation is in progress.
///
/// This state is used to show loading indicators during user data
/// operations like loading, updating, or initializing user information.
class UserLoading extends UserState {}

/// State indicating that user data has been successfully loaded.
///
/// This state contains the loaded user information and is used
/// throughout the app to access current user data.
class UserLoaded extends UserState {
  /// The loaded user data.
  final UserModel user;

  /// Creates a [UserLoaded] state with the given [user] data.
  UserLoaded(this.user);

  @override
  List<Object?> get props => [user];
}

/// State indicating that a user operation has failed.
///
/// This state contains an error message that can be displayed to the user
/// when user operations fail.
class UserError extends UserState {
  /// The error message describing what went wrong.
  final String message;

  /// Creates a [UserError] state with the given error [message].
  UserError(this.message);

  @override
  List<Object?> get props => [message];
}

/// Simple user model for representing user data in the application.
///
/// This model contains basic user information and provides methods for
/// serialization/deserialization with Firestore operations.
/// Simple user model for representing user data in the application.
///
/// This model contains basic user information and provides methods for
/// serialization/deserialization with Firestore operations.
class UserModel {
  /// Unique identifier for the user (Firebase UID).
  final String id;

  /// User's email address.
  final String email;

  /// User's first name.
  final String prenom;

  /// User's last name (optional).
  final String? nom;

  /// Platform used for authentication (e.g., 'google', 'apple', 'email').
  final String? authMethod;

  /// User's phone number (optional).
  final String? phoneNumber;

  /// User's profile picture URL (optional).
  final String? profilePictureUrl;

  /// Firebase Cloud Messaging token for push notifications.
  final String? fcmToken;

  /// Creates a new [UserModel] instance.
  ///
  /// [id], [email], and [prenom] are required fields.
  /// [nom], [authMethod], [phoneNumber], and [profilePictureUrl] are optional and can be null.
  UserModel({
    required this.id,
    required this.email,
    required this.prenom,
    this.nom,
    this.authMethod,
    this.phoneNumber,
    this.profilePictureUrl,
    this.fcmToken,
  });

  /// Creates a [UserModel] instance from a JSON map.
  ///
  /// Handles null values gracefully by providing default values.
  /// [prenom] defaults to 'Voyageur' (Traveler) if not provided.
  factory UserModel.fromJson(Map<String, dynamic> json) {
    return UserModel(
      id: json['id'] ?? '',
      email: json['email'] ?? '',
      prenom: json['prenom'] ?? 'Voyageur',
      nom: json['nom'],
      authMethod: json['authMethod'] ?? json['platform'],
      phoneNumber: json['phoneNumber'],
      profilePictureUrl: json['profilePictureUrl'],
      fcmToken: json['fcmToken'],
    );
  }

  /// Converts the [UserModel] instance to a JSON map.
  ///
  /// Useful for storing user data in Firestore or other JSON-based operations.
  Map<String, dynamic> toJson() {
    return {
      'id': id,
      'email': email,
      'prenom': prenom,
      'nom': nom,
      'authMethod': authMethod,
      'phoneNumber': phoneNumber,
      'profilePictureUrl': profilePictureUrl,
      'fcmToken': fcmToken,
    };
  }
}
