interface CampaignInterface {
	id: number;
	parentId: number;
	code: string | null;
	title: string;
	description: string | null;
	descriptionText: string | null;
	template: string | null;
	type: string;
	sendAt: Date | null;
	status: number;
	lifeCycleStatus?: number;
	userId: number | null;
	lastUpdatedBy: number | null;
	accountId: number | null;
	filters?: CampaingnFilters;
	sortOrder: number;
	isRecurring: boolean;
	isRevision: boolean;
	revisionId: number | null;
	attachmentId: number | null;
	templateStatus?: boolean | null;
	receiverListFileId?: number | null;
	createdAt?: Date;
	updatedAt?: Date;
	isUserAssigned?: boolean;
}

interface CampaignContentInterface {
	id?: number;
	campaignId?: number;
	languageId: number;
	name: string;
	description: Text;
	descriptionText: Text;
}

interface CampaignRequestObject {
	title: string;
	code?: string;
	description?: Text | string | null;
	descriptionText?: Text | string | null;
	status: number | null;
	attachmentId?: number | null;
	parentId?: number | null;
	template?: Text | string | null;
	sendAt?: Date;
	type: string;
	receiverListFileId?: number | null;
	filters?: CampaingnFilters;
	isUserAssigned?: boolean;
	isRecurring?: boolean;
}

interface CampaingnFilters {
	userType?: string;
	userIds?: number[];
}

interface CampaignObject {
	title: string;
	code?: string;
	description?: Text | string | null;
	descriptionText?: Text | string | null;
	status: number | null;
	attachmentId?: number | null;
	parentId?: number | null;
	lastUpdatedBy?: number | null;
	template?: Text | string | null;
	sendAt?: Date;
	filters?: CampaingnFilters;
}

interface CampaignIdentifierObject {
	id: number;
}

interface CampaignStringIdentifierObject {
	code: string;
}

interface CampaignListRequestObject {
	page: number;
	perPage: number;
	parentId: number | null;
	searchText: string | null;
	sortBy: string;
	sortDirection: string;
	status: number | null;
	id?: number | null;
}

interface CampaignListAllRequestObject {
	searchText: string | null;
	parentId: number | null;
	sortBy: string;
	sortDirection: string;
	status: number | null;
	id?: number | null;
}

interface CampaignTypeObjectRefInterface {
	id: number;
	code: string;
	name: string;
}

interface ParentCampaignObjectRefInterface {
	id: number;
	code: string;
	name: string;
	parentId: number | null;
}

interface CampaignObjectInteface {
	id: number;
	code: string;
	title: string;
	description?: Text | null;
	campaignAttachment?: fileObject;
	parentCampaign?: ParentCampaignObjectRefInterface;
	author: UserPublicObjectInterface | null;
	lastUpdatedBy: UserPublicObjectInterface | null;
	createdAt: Date;
	updatedAt: Date;
	template: Text | null;
	sendAt: Date;
	filters: CampaingnFilters;
}

interface CampaignDataObject {
	id?: number;
	code?: string;
	attachmentId?: number | null;
	userId: number | null;
	accountId: number | null;
	lastUpdatedBy?: number | null;
}

interface CampaignObjectSummaryInteface {
	id: number;
	code: string;
	campaignAttachment?: fileObject;
	name: string;
	description?: Text | null;
	createdAt: Date;
	updatedAt: Date;
}

interface CampaignPaginatedList {
	page: number;
	perPage: number;
	totalRecords: number;
	totalPages?: number;
	data: CampaignObjectSummaryInteface[] | [];
}

interface CampaignPaginatedData {
	count: number;
	rows: CampaignObjectSummaryInteface[] | [];
}

interface CampaignHirarchyInterface {
	id?: number;
	name: string;
	code: string;
	parentId: number | null;
}

interface CampaignTree {
	id: number;
	code: string;
	name: string;
	campaignAttachment?: fileObject;
	childCategories: CampaignTree[] | [];
}

interface CampaignSortRequest {
	before: number | null;
	after: number | null;
}

interface CampaignStatusObject {
	status: number;
}

interface CampaignSortIdentifierObject {
	id: number;
	campaignTypeCode: string;
}

interface CampaignUserInterface {
	id: number;
	userId: number;
	campaignId: number;
	acknowledgementId: string | null;
	status: number;
	createdAt?: Date;
	updatedAt?: Date;
}

interface CampaignLogInterface {
	id?: number;
	userId: number;
	accountId: number | null;
	campaignId: number;
	sendTo: string;
	deviceType: string | null;
	replacements: JSON | null;
	template: string | null;
	status: number;
	messageId: number;
	openCount: number;
	clickCount: number;
	complaintStatus: number;
	createdAt?: Date;
	updatedAt?: Date;
}

interface WhatsAppComponentItem {
	type: string;
	value: string;
}

interface WhatsAppComponents {
	[key: string]: WhatsAppComponentItem; // e.g., body_1, body_2, body_3...
}

interface WhatsAppReceiverItem {
	to: string[];
	components: WhatsAppComponents | {};
}

interface RunReport {
	campaignId: number;
	totalUsers: number;
	successUsers: number;
	failedUsers: number;
}

interface CampaignCreateServiceInput {
	title: string;
	description?: Text | string | null;
	template?: Text | string | null;
	attachmentId?: number | null;
	parentId?: number | null;
	type: string;
	status: number | null;
	sendAt?: Date;
	filters?: CampaingnFilters;
	receiverListFileId?: number | null;
	isRecurring?: boolean;
	challengeId?: number | null;
}

interface CampaignUpdateServiceInput {
	id: number;
	title: string;
	description?: Text | string | null;
	template?: Text | string | null;
	attachmentId?: number | null;
	parentId?: number | null;
	type: string;
	status: number | null;
	sendAt?: Date;
	filters?: CampaingnFilters;
	receiverListFileId?: number | null;
	isRecurring?: boolean;
}

interface CampaignDeleteServiceInput {
	id: number;
	campaignTypeCode: string;
}

interface CampaignGetByIdServiceInput {
	id: number;
	fullInfo?: boolean;
}

interface CampaignGetByCodeServiceInput {
	code: string;
	fullInfo?: boolean;
}

interface CampaignGetCampaignsServiceInput {
	listRequest: CampaignListRequestObject;
}

interface CampaignGetAllCampaignsServiceInput {
	listRequest: CampaignListAllRequestObject;
}

interface CampaignGetRevisionsServiceInput {
	id: number;
	listRequest: CampaignListRequestObject;
}

interface CampaignRestoreRevisionServiceInput {
	id: number;
}

interface CampaignSetSortOrderServiceInput {
	id: number;
	before: number | null;
	after: number | null;
}

interface CampaignUpdateStatusServiceInput {
	id: number;
	status: number;
}

interface CampaignAddUsersServiceInput {
	id: number;
}

interface CampaignListUsersServiceInput {
	listRequest: CampaignListRequestObject;
}

interface CampaignGenerateReportServiceInput {
	id: number;
	isComplete?: boolean;
}

interface CampaignGetLogsServiceInput {
	campaignId: number;
	isComplete: boolean;
	page: number;
	perPage: number;
}

interface CampaignWhatsappWebhookServiceInput {
	requestId: string;
	eventName: string;
	customerNumber: string;
}

interface CampaignVerifyIdServiceInput {
	campaignId: number;
}

interface CampaignGetIdServiceInput {
	code: string;
}

interface CampaignSetSortOrderDaoInput {
	id: number;
	before?: number | null;
	after?: number | null;
}

interface CampaignGetFullObjectDaoInput {
	id: number;
}

interface CampaignStoreRevisionDaoInput {
	id: number;
}

interface CampaignGetDaoInput {
	id?: number | null;
	code?: string | null;
	fullInfo?: boolean;
	paranoid?: boolean;
}

interface CampaignGetByIdDaoInput {
	id: number;
	fullInfo?: boolean;
	paranoid?: boolean;
}

interface CampaignGetByCodeDaoInput {
	code: string;
	fullInfo?: boolean;
	paranoid?: boolean;
}

interface CampaignDoExistsByCodeDaoInput {
	code: string;
	excludeId?: number | null;
	includeRevision?: boolean;
}

interface CampaignDoExistsByIdDaoInput {
	id: number;
	includeRevision?: boolean;
}

interface CampaignUpdateStatusDaoInput {
	id: number;
	status: number;
}

interface CampaignCreateDaoInput {
	campaignObj: CampaignObject;
	challengeId?: number | null;
}

interface CampaignUpdateDaoInput {
	id: number;
	campaignObj: CampaignObject;
}

interface CampaignDeleteDaoInput {
	id: number;
}

interface CampaignGetListDaoInput {
	listRequest: CampaignListRequestObject;
}

interface CampaignGetAllListDaoInput {
	listRequest: CampaignListAllRequestObject;
}

interface CampaignGetRevisionListDaoInput {
	id: number;
	listRequest: CampaignListRequestObject;
}

interface CampaignRestoreRevisionDaoInput {
	id: number;
}

interface CampaignVerifyIdDaoInput {
	campaignId: number;
}

interface CampaignGetIdDaoInput {
	code: string;
}

interface CampaignHasChildDaoInput {
	id: number;
}

interface CampaignAddUsersDaoInput {
	id: number;
	filters?: CampaingnFilters;
}

interface CampaignGetUsersDaoInput {
	listRequest: CampaignListRequestObject;
}

interface CampaignGenerateReportDaoInput {
	campaignId: number;
	isComplete: boolean;
}

interface CampaignGetLogsDaoInput {
	campaignId: number;
	isComplete: boolean;
	page: number;
	perPage: number;
}

interface CampaignWhatsappWebhookDaoInput {
	requestId: string;
	eventName: string;
	customerNumber: string;
}
