interface EmailTemplateInterface {
    id?: number;
    code: string;
    userId: number;
    accountId: number;
    replacements: string;
    lastUpdatedBy?: number;
    isRevision?: Boolean;
    revisionId?: number;
    status: number;
    sortOrder?: number;
    EmailTemplateContent?: EmailTemplateContentObject;
    EmailTemplateContents?: EmailTemplateContentObject[];
}

interface EmailTemplateContentInterface {
    id?: number;
    emailTemplateId?: number;
    languageId?: number;
    title: string;
    subject: string;
    body: Text | null;
    bodyText: Text | null;
}

interface EmailTemplateRequestObject {
    title: string;
    subject: string;
    body: Text;
    code: string;
    status: number | null;
    emailTemplateAttachmentIds: number[] | null
}

interface EmailTemplateObject {
    id?: number;
    code: string;
    replacements?: string;
    status: number | null;
}

interface EmailTemplateContentObject {
    id?: number;
    emailTemplateId?: number;
    title: string;
    subject: string;
    body: Text;
    bodyText?: Text | null;
}

interface EmailTemplateObjectInteface {
    id: number;
    code: string;
    status: number;
    replacements: string,
    title: string;
    subject: string;
    body?: Text | null;
    bodyText?: Text | null;
    author: UserPublicObjectInterface | null;
    lastUpdatedBy: UserPublicObjectInterface | null;
    emailTemplateAttachments: fileObject[] | null;
    createdAt: Date;
    updatedAt: Date;
}

interface EmailTemplateObjectSummaryInteface {
    id: number;
    code: string;
    status: number;
    title: string;
    subject: string;
    body?: Text | null;
    bodyText?: Text | null;
    createdAt: Date;
    updatedAt: Date;
}

interface EmailTemplateDataObject {
    id?: number;
    code?: string;
    userId: number | null;
    accountId: number | null;
    lastUpdatedBy?: number;
    emailTemplateContents?: EmailTemplateContentObject[];
    emailTemplateContent?: EmailTemplateContentObject;
}

interface EmailTemplateListRequestObject {
    status: number | null;
    page: number;
    perPage: number;
    searchText: string | null;
    sortBy: string;
    sortDirection: string;
}

interface EmailTemplateListAllRequestObject {
    status: number | null;
    page: number;
    perPage: number;
    searchText: string | null;
    sortBy: string;
    sortDirection: string;
}

interface EmailTemplatePaginatedList {
    page: number;
    perPage: number;
    totalRecords: number;
    totalPages?: number;
    data: EmailTemplateObjectSummaryInteface[] | [];
}

interface EmailTemplatePaginatedData {
    count: number;
    rows: EmailTemplateObjectSummaryInteface[];
}

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

interface EmailTemplateIdentifierObject {
    id: number;
}

interface EmailTemplateStatusObject {
    status: number;
}

interface EmailTemplateCreateServiceInput {
    title: string;
    code: string;
    subject: string;
    body: Text;
    status: number | null;
    emailTemplateAttachmentIds: number[] | null;
}

interface EmailTemplateUpdateServiceInput {
    id: number;
    title: string;
    code: string;
    subject: string;
    body: Text;
    status: number | null;
    emailTemplateAttachmentIds: number[] | null;
}

interface EmailTemplateDeleteServiceInput {
    id: number;
}

interface EmailTemplateGetByIdServiceInput {
    id: number;
    expanded?: boolean;
}

interface EmailTemplateGetByCodeServiceInput {
    code: string;
    expanded?: boolean;
}

interface EmailTemplateGetListServiceInput {
    listRequest: EmailTemplateListRequestObject;
    language?: string | null;
}

interface EmailTemplateGetAllListServiceInput {
    listRequest: EmailTemplateListAllRequestObject;
    language?: string | null;
}

interface EmailTemplateGetRevisionsServiceInput {
    id: number;
    listRequest: EmailTemplateListRequestObject;
    language?: string | null;
}

interface EmailTemplateRestoreRevisionServiceInput {
    id: number;
}

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

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

interface EmailTemplateGetIdServiceInput {
    code: string;
}

interface EmailTemplateGetFullObjectDaoInput {
    id: number;
}

interface EmailTemplateStoreRevisionDaoInput {
    id: number;
}

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

interface EmailTemplateGetDaoInput {
    id?: number | null;
    code?: string | null;
    expanded?: boolean;
    paranoid?: boolean;
}

interface EmailTemplateGetByIdDaoInput {
    id: number;
    expanded?: boolean;
    paranoid?: boolean;
}

interface EmailTemplateGetByCodeDaoInput {
    code: string;
    expanded?: boolean;
    paranoid?: boolean;
}

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

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

interface EmailTemplateCreateDaoInput {
    emailTemplateObj: EmailTemplateObject;
    emailTemplateContentObj: EmailTemplateContentObject;
    emailTemplateAttachments: number[] | null;
    languages: LanguageInfo;
}

interface EmailTemplateUpdateDaoInput {
    id: number;
    emailTemplateObj: EmailTemplateObject;
    emailTemplateContentObj: EmailTemplateContentObject;
    emailTemplateAttachments: number[] | null;
    languages: LanguageInfo;
}

interface EmailTemplateDeleteDaoInput {
    id: number;
}

interface EmailTemplateGetListDaoInput {
    listRequest: EmailTemplateListRequestObject;
    language: string | null;
}

interface EmailTemplateGetAllListDaoInput {
    listRequest: EmailTemplateListAllRequestObject;
    language: string | null;
}

interface EmailTemplateGetRevisionListDaoInput {
    id: number;
    listRequest: EmailTemplateListRequestObject;
    language: string | null;
}

interface EmailTemplateRestoreRevisionDaoInput {
    id: number;
}

interface EmailTemplateGetIdDaoInput {
    code: string;
}

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