class DirectoryCommentResponse {
  final bool success;
  final String message;
  final List<DirectoryComment> data;
  final int statusCode;
  final String? timestamp;

  DirectoryCommentResponse({
    required this.success,
    required this.message,
    required this.data,
    required this.statusCode,
    this.timestamp,
  });

  factory DirectoryCommentResponse.fromJson(Map<String, dynamic> json) {
    return DirectoryCommentResponse(
      success: json['success'] ?? false,
      message: json['message'] ?? '',
      data: (json['data'] as List<dynamic>?)
              ?.map((e) => DirectoryComment.fromJson(e))
              .toList() ??
          [],
      statusCode: json['statusCode'] ?? 0,
      timestamp: json['timestamp'],
    );
  }
}

class DirectoryComment {
  final String id;
  final String note;
  final String contactName;
  final String organizationName;
  final DateTime createdAt;
  final CommentUser createdBy;
  final DateTime? updatedAt;
  final CommentUser? updatedBy;
  final String contactId;
  final bool isActive;

  DirectoryComment({
    required this.id,
    required this.note,
    required this.contactName,
    required this.organizationName,
    required this.createdAt,
    required this.createdBy,
    this.updatedAt,
    this.updatedBy,
    required this.contactId,
    required this.isActive,
  });

  factory DirectoryComment.fromJson(Map<String, dynamic> json) {
    return DirectoryComment(
      id: json['id'] ?? '',
      note: json['note'] ?? '',
      contactName: json['contactName'] ?? '',
      organizationName: json['organizationName'] ?? '',
      createdAt: DateTime.parse(json['createdAt']),
      createdBy: CommentUser.fromJson(json['createdBy']),
      updatedAt:
          json['updatedAt'] != null ? DateTime.parse(json['updatedAt']) : null,
      updatedBy: json['updatedBy'] != null
          ? CommentUser.fromJson(json['updatedBy'])
          : null,
      contactId: json['contactId'] ?? '',
      isActive: json['isActive'] ?? true,
    );
  }
  @override
  bool operator ==(Object other) =>
      identical(this, other) ||
      other is DirectoryComment &&
          runtimeType == other.runtimeType &&
          id == other.id;

  @override
  int get hashCode => id.hashCode;

  DirectoryComment copyWith({
    String? id,
    String? note,
    String? contactName,
    String? organizationName,
    DateTime? createdAt,
    CommentUser? createdBy,
    DateTime? updatedAt,
    CommentUser? updatedBy,
    String? contactId,
    bool? isActive,
  }) {
    return DirectoryComment(
      id: id ?? this.id,
      note: note ?? this.note,
      contactName: contactName ?? this.contactName,
      organizationName: organizationName ?? this.organizationName,
      createdAt: createdAt ?? this.createdAt,
      createdBy: createdBy ?? this.createdBy,
      updatedAt: updatedAt ?? this.updatedAt,
      updatedBy: updatedBy ?? this.updatedBy,
      contactId: contactId ?? this.contactId,
      isActive: isActive ?? this.isActive,
    );
  }
}

class CommentUser {
  final String id;
  final String firstName;
  final String lastName;
  final String? photo;
  final String jobRoleId;
  final String jobRoleName;

  CommentUser({
    required this.id,
    required this.firstName,
    required this.lastName,
    this.photo,
    required this.jobRoleId,
    required this.jobRoleName,
  });

  factory CommentUser.fromJson(Map<String, dynamic> json) {
    return CommentUser(
      id: json['id'] ?? '',
      firstName: json['firstName'] ?? '',
      lastName: json['lastName'] ?? '',
      photo: json['photo'],
      jobRoleId: json['jobRoleId'] ?? '',
      jobRoleName: json['jobRoleName'] ?? '',
    );
  }

  CommentUser copyWith({
    String? id,
    String? firstName,
    String? lastName,
    String? photo,
    String? jobRoleId,
    String? jobRoleName,
  }) {
    return CommentUser(
      id: id ?? this.id,
      firstName: firstName ?? this.firstName,
      lastName: lastName ?? this.lastName,
      photo: photo ?? this.photo,
      jobRoleId: jobRoleId ?? this.jobRoleId,
      jobRoleName: jobRoleName ?? this.jobRoleName,
    );
  }
}
