class PaymentRequestDetail {
  final bool? success;
  final String? message;
  final PaymentRequestData? data;
  final dynamic errors;
  final int? statusCode;
  final DateTime? timestamp;

  PaymentRequestDetail({
    this.success,
    this.message,
    this.data,
    this.errors,
    this.statusCode,
    this.timestamp,
  });

  factory PaymentRequestDetail.fromJson(Map<String, dynamic> json) =>
      PaymentRequestDetail(
        success: json['success'] as bool?,
        message: json['message'] as String?,
        data: json['data'] != null
            ? PaymentRequestData.fromJson(json['data'])
            : null,
        errors: json['errors'],
        statusCode: json['statusCode'] as int?,
        timestamp: json['timestamp'] != null
            ? DateTime.tryParse(json['timestamp'])
            : null,
      );

  Map<String, dynamic> toJson() => {
        'success': success,
        'message': message,
        'data': data?.toJson(),
        'errors': errors,
        'statusCode': statusCode,
        'timestamp': timestamp?.toIso8601String(),
      };
}

class PaymentRequestData {
  final String? id;
  final String? title;
  final String? description;
  final String? paymentRequestUID;
  final String? payee;
  final Currency? currency;
  final double? amount;
  final double? baseAmount;
  final double? taxAmount;
  final DateTime? dueDate;
  final Project? project;
  final RecurringPayment? recurringPayment;
  final ExpenseCategory? expenseCategory;
  final ExpenseStatus? expenseStatus;
  final String? paidTransactionId;
  final DateTime? paidAt;
  final User? paidBy;
  final bool? isAdvancePayment;
  final DateTime? createdAt;
  final User? createdBy;
  final DateTime? updatedAt;
  final User? updatedBy;
  final List<NextStatus>? nextStatus;
  final List<UpdateLog>? updateLogs;
  final List<Attachment>? attachments;
  final bool? isActive;
  final bool? isExpenseCreated;

  PaymentRequestData({
    this.id,
    this.title,
    this.description,
    this.paymentRequestUID,
    this.payee,
    this.currency,
    this.amount,
    this.baseAmount,
    this.taxAmount,
    this.dueDate,
    this.project,
    this.recurringPayment,
    this.expenseCategory,
    this.expenseStatus,
    this.paidTransactionId,
    this.paidAt,
    this.paidBy,
    this.isAdvancePayment,
    this.createdAt,
    this.createdBy,
    this.updatedAt,
    this.updatedBy,
    this.nextStatus,
    this.updateLogs,
    this.attachments,
    this.isActive,
    this.isExpenseCreated,
  });

  factory PaymentRequestData.fromJson(Map<String, dynamic> json) =>
      PaymentRequestData(
        id: json['id'] as String?,
        title: json['title'] as String?,
        description: json['description'] as String?,
        paymentRequestUID: json['paymentRequestUID'] as String?,
        payee: json['payee'] as String?,
        currency: json['currency'] != null
            ? Currency.fromJson(json['currency'])
            : null,
        amount: (json['amount'] as num?)?.toDouble(),
        baseAmount: (json['baseAmount'] as num?)?.toDouble(),
        taxAmount: (json['taxAmount'] as num?)?.toDouble(),
        dueDate: json['dueDate'] != null
            ? DateTime.tryParse(json['dueDate'])
            : null,
        project: json['project'] != null
            ? Project.fromJson(json['project'])
            : null,
        recurringPayment: json['recurringPayment'] != null
            ? RecurringPayment.fromJson(json['recurringPayment'])
            : null,
        expenseCategory: json['expenseCategory'] != null
            ? ExpenseCategory.fromJson(json['expenseCategory'])
            : null,
        expenseStatus: json['expenseStatus'] != null
            ? ExpenseStatus.fromJson(json['expenseStatus'])
            : null,
        paidTransactionId: json['paidTransactionId'] as String?,
        paidAt: json['paidAt'] != null
            ? DateTime.tryParse(json['paidAt'])
            : null,
        paidBy:
            json['paidBy'] != null ? User.fromJson(json['paidBy']) : null,
        isAdvancePayment: json['isAdvancePayment'] as bool?,
        createdAt: json['createdAt'] != null
            ? DateTime.tryParse(json['createdAt'])
            : null,
        createdBy: json['createdBy'] != null
            ? User.fromJson(json['createdBy'])
            : null,
        updatedAt: json['updatedAt'] != null
            ? DateTime.tryParse(json['updatedAt'])
            : null,
        updatedBy:
            json['updatedBy'] != null ? User.fromJson(json['updatedBy']) : null,
        nextStatus: (json['nextStatus'] as List?)
                ?.map((e) => NextStatus.fromJson(e))
                .toList() ??
            [],
        updateLogs: (json['updateLogs'] as List?)
                ?.map((e) => UpdateLog.fromJson(e))
                .toList() ??
            [],
        attachments: (json['attachments'] as List?)
                ?.map((e) => Attachment.fromJson(e))
                .toList() ??
            [],
        isActive: json['isActive'] as bool?,
        isExpenseCreated: json['isExpenseCreated'] as bool?,
      );

  Map<String, dynamic> toJson() => {
        'id': id,
        'title': title,
        'description': description,
        'paymentRequestUID': paymentRequestUID,
        'payee': payee,
        'currency': currency?.toJson(),
        'amount': amount,
        'baseAmount': baseAmount,
        'taxAmount': taxAmount,
        'dueDate': dueDate?.toIso8601String(),
        'project': project?.toJson(),
        'recurringPayment': recurringPayment?.toJson(),
        'expenseCategory': expenseCategory?.toJson(),
        'expenseStatus': expenseStatus?.toJson(),
        'paidTransactionId': paidTransactionId,
        'paidAt': paidAt?.toIso8601String(),
        'paidBy': paidBy?.toJson(),
        'isAdvancePayment': isAdvancePayment,
        'createdAt': createdAt?.toIso8601String(),
        'createdBy': createdBy?.toJson(),
        'updatedAt': updatedAt?.toIso8601String(),
        'updatedBy': updatedBy?.toJson(),
        'nextStatus': nextStatus?.map((e) => e.toJson()).toList(),
        'updateLogs': updateLogs?.map((e) => e.toJson()).toList(),
        'attachments': attachments?.map((e) => e.toJson()).toList(),
        'isActive': isActive,
        'isExpenseCreated': isExpenseCreated,
      };
}

class RecurringPayment {
  final String? id;
  final String? recurringPaymentUID;
  final double? amount;
  final bool? isVariable;

  RecurringPayment({
    this.id,
    this.recurringPaymentUID,
    this.amount,
    this.isVariable,
  });

  factory RecurringPayment.fromJson(Map<String, dynamic> json) =>
      RecurringPayment(
        id: json['id'] as String?,
        recurringPaymentUID: json['recurringPaymentUID'] as String?,
        amount: (json['amount'] as num?)?.toDouble(),
        isVariable: json['isVariable'] as bool?,
      );

  Map<String, dynamic> toJson() => {
        'id': id,
        'recurringPaymentUID': recurringPaymentUID,
        'amount': amount,
        'isVariable': isVariable,
      };
}

class Currency {
  final String? id;
  final String? currencyCode;
  final String? currencyName;
  final String? symbol;
  final bool? isActive;

  Currency({
    this.id,
    this.currencyCode,
    this.currencyName,
    this.symbol,
    this.isActive,
  });

  factory Currency.fromJson(Map<String, dynamic> json) => Currency(
        id: json['id'] as String?,
        currencyCode: json['currencyCode'] as String?,
        currencyName: json['currencyName'] as String?,
        symbol: json['symbol'] as String?,
        isActive: json['isActive'] as bool?,
      );

  Map<String, dynamic> toJson() => {
        'id': id,
        'currencyCode': currencyCode,
        'currencyName': currencyName,
        'symbol': symbol,
        'isActive': isActive,
      };
}

class Project {
  final String? id;
  final String? name;

  Project({this.id, this.name});

  factory Project.fromJson(Map<String, dynamic> json) =>
      Project(id: json['id'] as String?, name: json['name'] as String?);

  Map<String, dynamic> toJson() => {'id': id, 'name': name};
}

class ExpenseCategory {
  final String? id;
  final String? name;
  final bool? noOfPersonsRequired;
  final bool? isAttachmentRequried;
  final String? description;

  ExpenseCategory({
    this.id,
    this.name,
    this.noOfPersonsRequired,
    this.isAttachmentRequried,
    this.description,
  });

  factory ExpenseCategory.fromJson(Map<String, dynamic> json) =>
      ExpenseCategory(
        id: json['id'] as String?,
        name: json['name'] as String?,
        noOfPersonsRequired: json['noOfPersonsRequired'] as bool?,
        isAttachmentRequried: json['isAttachmentRequried'] as bool?,
        description: json['description'] as String?,
      );

  Map<String, dynamic> toJson() => {
        'id': id,
        'name': name,
        'noOfPersonsRequired': noOfPersonsRequired,
        'isAttachmentRequried': isAttachmentRequried,
        'description': description,
      };
}

class ExpenseStatus {
  final String? id;
  final String? name;
  final String? displayName;
  final String? description;
  final List<String>? permissionIds;
  final String? color;
  final bool? isSystem;

  ExpenseStatus({
    this.id,
    this.name,
    this.displayName,
    this.description,
    this.permissionIds,
    this.color,
    this.isSystem,
  });

  factory ExpenseStatus.fromJson(Map<String, dynamic> json) => ExpenseStatus(
        id: json['id'] as String?,
        name: json['name'] as String?,
        displayName: json['displayName'] as String?,
        description: json['description'] as String?,
        permissionIds: json['permissionIds'] != null
            ? List<String>.from(json['permissionIds'])
            : null,
        color: json['color'] as String?,
        isSystem: json['isSystem'] as bool?,
      );

  Map<String, dynamic> toJson() => {
        'id': id,
        'name': name,
        'displayName': displayName,
        'description': description,
        'permissionIds': permissionIds,
        'color': color,
        'isSystem': isSystem,
      };
}

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

  User({
    this.id,
    this.firstName,
    this.lastName,
    this.email,
    this.photo,
    this.jobRoleId,
    this.jobRoleName,
  });

  factory User.fromJson(Map<String, dynamic> json) => User(
        id: json['id'] as String?,
        firstName: json['firstName'] as String?,
        lastName: json['lastName'] as String?,
        email: json['email'] as String?,
        photo: json['photo'] as String?,
        jobRoleId: json['jobRoleId'] as String?,
        jobRoleName: json['jobRoleName'] as String?,
      );

  Map<String, dynamic> toJson() => {
        'id': id,
        'firstName': firstName,
        'lastName': lastName,
        'email': email,
        'photo': photo,
        'jobRoleId': jobRoleId,
        'jobRoleName': jobRoleName,
      };
}

class NextStatus {
  final String? id;
  final String? name;
  final String? displayName;
  final String? description;
  final List<String>? permissionIds;
  final String? color;
  final bool? isSystem;

  NextStatus({
    this.id,
    this.name,
    this.displayName,
    this.description,
    this.permissionIds,
    this.color,
    this.isSystem,
  });

  factory NextStatus.fromJson(Map<String, dynamic> json) => NextStatus(
        id: json['id'] as String?,
        name: json['name'] as String?,
        displayName: json['displayName'] as String?,
        description: json['description'] as String?,
        permissionIds: json['permissionIds'] != null
            ? List<String>.from(json['permissionIds'])
            : null,
        color: json['color'] as String?,
        isSystem: json['isSystem'] as bool?,
      );

  Map<String, dynamic> toJson() => {
        'id': id,
        'name': name,
        'displayName': displayName,
        'description': description,
        'permissionIds': permissionIds,
        'color': color,
        'isSystem': isSystem,
      };
}

class UpdateLog {
  final String? id;
  final ExpenseStatus? status;
  final ExpenseStatus? nextStatus;
  final String? comment;
  final DateTime? updatedAt;
  final User? updatedBy;

  UpdateLog({
    this.id,
    this.status,
    this.nextStatus,
    this.comment,
    this.updatedAt,
    this.updatedBy,
  });

  factory UpdateLog.fromJson(Map<String, dynamic> json) => UpdateLog(
        id: json['id'] as String?,
        status: json['status'] != null
            ? ExpenseStatus.fromJson(json['status'])
            : null,
        nextStatus: json['nextStatus'] != null
            ? ExpenseStatus.fromJson(json['nextStatus'])
            : null,
        comment: json['comment'] as String?,
        updatedAt: json['updatedAt'] != null
            ? DateTime.tryParse(json['updatedAt'])
            : null,
        updatedBy: json['updatedBy'] != null
            ? User.fromJson(json['updatedBy'])
            : null,
      );

  Map<String, dynamic> toJson() => {
        'id': id,
        'status': status?.toJson(),
        'nextStatus': nextStatus?.toJson(),
        'comment': comment,
        'updatedAt': updatedAt?.toIso8601String(),
        'updatedBy': updatedBy?.toJson(),
      };
}

class Attachment {
  final String? id;
  final String? fileName;
  final String? url;
  final String? thumbUrl;
  final int? fileSize;
  final String? contentType;

  Attachment({
    this.id,
    this.fileName,
    this.url,
    this.thumbUrl,
    this.fileSize,
    this.contentType,
  });

  factory Attachment.fromJson(Map<String, dynamic> json) => Attachment(
        id: json['id'] as String?,
        fileName: json['fileName'] as String?,
        url: json['url'] as String?,
        thumbUrl: json['thumbUrl'] as String?,
        fileSize: json['fileSize'] as int?,
        contentType: json['contentType'] as String?,
      );

  Map<String, dynamic> toJson() => {
        'id': id,
        'fileName': fileName,
        'url': url,
        'thumbUrl': thumbUrl,
        'fileSize': fileSize,
        'contentType': contentType,
      };
}
