interface NotificationLogInterface {
    id?: number;
    userId: number;
    notificationId: number;
    fromUserId?: number | null;
    replacements: Record<string, any> | null;
    isViewed: boolean;
    isRead: boolean;
    createdAt?: Date;
    updatedAt?: Date;
}

interface NotificationLogNotification {
    id: number;
    code: string;
    replacements: string;
    title: string;
    body: string | null;
    bodyText: string | null;
    notificationImage: fileObject | null;
}

interface NotificationLogResolvedData {
    [key: string]: any;
}

interface NotificationLogFromUser {
    id: number;
    name: string | null;
    profileImage: fileObject | null;
}

interface NotificationLogObjectInterface {
    id: number;
    userId: number;
    notificationId: number;
    fromUserId: number | null;
    fromUser: NotificationLogFromUser | null;
    replacements: Record<string, any> | null;
    isViewed: boolean;
    isRead: boolean;
    notification: NotificationLogNotification | null;
    resolvedData?: NotificationLogResolvedData | null;
    createdAt: Date;
    updatedAt: Date;
}

interface NotificationLogListRequestObject {
    page: number;
    perPage: number;
    isViewed: boolean | null;
    isRead: boolean | null;
}

interface NotificationLogPaginatedData {
    count: number;
    rows: NotificationLogObjectInterface[];
}

interface NotificationLogPaginatedList {
    data: NotificationLogObjectInterface[];
    page: number;
    perPage: number;
    totalRecords: number;
    totalPages: number;
}

// Service Input Interfaces
interface NotificationLogEmitServiceInput {
    userId: number;
    notificationId: number;
    fromUserId?: number | null;
    replacements: Record<string, any> | null;
}

interface NotificationLogEmitByCodeServiceInput {
    userId: number;
    notificationCode: string;
    fromUserId?: number | null;
    replacements: Record<string, any> | null;
}

interface NotificationLogGetListServiceInput {
    listRequest: NotificationLogListRequestObject;
}

interface NotificationLogMarkViewedServiceInput {
    id: number;
}

interface NotificationLogMarkReadServiceInput {
    id: number;
}

// DAO Input Interfaces
interface NotificationLogCreateDaoInput {
    userId: number;
    notificationId: number;
    fromUserId?: number | null;
    replacements: Record<string, any> | null;
}

interface NotificationLogGetByIdDaoInput {
    id: number;
}

interface NotificationLogGetListDaoInput {
    userId: number;
    listRequest: NotificationLogListRequestObject;
}

interface NotificationLogMarkViewedDaoInput {
    id: number;
    userId: number;
}

interface NotificationLogMarkReadDaoInput {
    id: number;
    userId: number;
}
